我有一个这样的JS对象:
{"field1":1,"field3":14,"category":9,"completion":null,"creation":"23-04-26", "settings":"[{"ip":""}]"}
我想创建一个函数,它返回这样的对象没有字段,这是string-array**“settings”:“[{“ip”:“"}]"**,如果这个数组只包含一个元素,如果这个对象只包含一个键值对,值为空字符串。
预期结果为:
{"field1":1,"field3":14,"category":9,"completion":null,"creation":"23-04-26"}
不筛选的数组:
{"field1":1,"field3":14,"category":9,"completion":null,"creation":"23-04-26", "settings":"[{"ip":"33333not empty"}]"}
或:
{"field1":1,"field3":14,"category":9,"completion":null,"creation":"23-04-26", "settings":"[{"ip":"345", "dns": "address"}]"}
我写了如下函数:
function filterArrayFields(values) {
const result = {};
const fieldNames = Object.keys(values);
fieldNames.forEach((fieldName) => {
if (typeof values[fieldName] !== 'string') {
result[fieldName] = values[fieldName];
return;
}
try {
const parsedValue = JSON.parse(values[fieldName]);
if (!Array.isArray(parsedValue)) {
result[fieldName] = values[fieldName];
return;
}
if (Array.isArray(parsedValue) && parsedValue.length > 1) {
result[fieldName] = values[fieldName];
return;
}
if (Array.isArray(parsedValue) && parsedValue.length === 1) {
const arrayTypeFieldValue = parsedValue[0];
const [arrayTypeFieldValueName] = Object.keys(arrayTypeFieldValue);
if (arrayTypeFieldValue[arrayTypeFieldValueName] !== '') {
result[fieldName] = values[fieldName];
return;
}
}
} catch (error) {
result[fieldName] = values[fieldName];
}
});
return result;
}
这个方法工作正常,但看起来像是重载了buyif-s或额外的条件。有没有可能优化这个函数?
2条答案
按热度按时间aiqt4smr1#
我认为,您可以通过spread操作符浅克隆输入对象,并仅在它符合您的标准时才有条件地将设置合并回来,从而显著地加强这一点。
标准测试可以由单独的专用函数处理。类似于以下内容:
mwngjboj2#
JS有一个内置的过滤器函数。对于设置值使用
JSON.stringify()
和JSON.parse()
将是最简单的方法来序列化数组