嵌套序列化JSON解析出现多余数字键值对,如何修复现有实现?
问题根因
- 错误出在
addValuesToObject的返回值使用逻辑:该函数最终返回的是嵌套路径最后一级对应的值,而非完整新对象。 - 当路径长度为1时(比如处理顶级key
value2对应的值"NO"),函数返回值就是字符串"NO",执行{ ...newObject, ...newEntry }时,JS会自动把字符串转成类数组对象展开,就产生了多余的0: "N"、1: "O"这类数字键。 - 且
addValuesToObject本身已经直接修改了传入的newObject原对象,完全不需要再做展开赋值的操作,这行多余的赋值才是问题的核心来源。
修复方案
只需要修改nestedJsonParser里else分支的逻辑,删掉多余的展开赋值即可,修改后的完整代码如下:
const addValuesToObject = ({ object, keysArray, value }) => { for (let i = 0; i < keysArray.length; i++) { const lastKey = i === keysArray.length - 1; object = object[keysArray[i]] = object[keysArray[i]] || (lastKey ? value : {}); } return object; }; const isStringifiedObject = (value) => typeof value === "string" && value[0] === "{" && value[value.length - 1] === "}"; const nestedJsonParser = (stringifiedObject) => { if (!stringifiedObject) return {}; let newObject = {}; const parser = (value, objectPath = []) => { const isStringified = isStringifiedObject(value); // if it's a stringified object, parse and add values; if (isStringified) { const newParsedObject = JSON.parse(value); const keys = Object.keys(newParsedObject); keys.forEach((key) => { parser(newParsedObject[key], [...objectPath, key]); }); } else { // 直接调用即可,addValuesToObject已经修改了newObject本身,不需要额外赋值 addValuesToObject({ value, keysArray: objectPath, object: newObject }); } }; parser(stringifiedObject); return newObject; };
验证结果
用示例输入测试,修改后输出为:
{ "value1": "name", "value2": "lastName", "value3": { "subValue1": "", "subValue2": null } }
符合预期,无多余数字键值对。
内容的提问来源于stack exchange,提问作者ChronicLogic
相关产品推荐
相关产品推荐

