如果您正在寻找没有对象中的“_x”解决方案,请尝试此代码。这是以上代码(非常出色)的轻微修改。
stringToObj = function(path,value,obj) {
var parts = path.split("."), part;
var last = parts.pop();
while(part = parts.shift()) {
if( typeof obj[part] != "object") obj[part] = {};
obj = obj[part]; // update "pointer"
}
obj[last] = value;
}
作为额外奖励,上述代码如果您想要更新现有对象的部分将会起作用 :)
var obj = {a:{b:3}};
stringToObj("a.b",10,obj);
console.log(obj); //result : {a:{b:10}}
你可以利用引用:
function stringToObj(path,value,obj) {
var parts = path.split("."), part;
while(part = parts.shift()) {
if( typeof obj[part] != "object") obj[part] = {};
obj = obj[part]; // update "pointer"
}
obj["_x"] = value;
}
function stringToObj(path, value, obj) {
var objValue = value;
try {
objValue = JSON.parse(value);
} catch (e) { } //eat the error, must not be json so carry on... Hack to do a valid JSON check
var parts = path.split("."), part;
var last = parts.pop();
while (part = parts.shift()) {
if (typeof obj[part] != "object")
obj[part] = {};
obj = obj[part];
}
if (obj.hasOwnProperty(last) && obj[last] && obj[last].constructor === Array) {
obj[last].push(objValue);
}
else if (obj.hasOwnProperty(last) && obj[last]) {
var objArray = [];
objArray.push(obj[last])
objArray.push(objValue);
obj[last] = objArray;
}
else {
obj[last] = objValue;
}
}
感谢大家的帮助!
这个问题可能已经有很好的答案了,但我想分享一下我的解决方案,希望对那些寻找不同方法的人有所帮助。
如果你想将字符串点表示法转换为字符串JSON,这是我的方法。
function dotToJson({ notation, inclusive = true, value = null }) {
const fragments = notation.split(".").reverse();
if (!inclusive) {
fragments.pop();
}
console.log(fragments);
return fragments.reduce((json, fragment) => {
if (isNaN(fragment)) {
return `{ "${fragment}": ${json} }`
}
let fill = "";
if (Number(fragment) > 0) {
for (let i = 0; i < fragment; i++) {
fill += "null, "
}
}
return `[${fill}${json}]`;
}, JSON.stringify(value));
};
属性 | 含义 |
---|---|
notation | 点符号字符串 |
inclusive | 包括根片段 |
value | 叶子的默认值 |
您可以在此处查看结果,我使用 Quokka.js 进行了测试。
注意:除此之外,这可能有助于更新对象,因为您可以使用解析后的 JSON 的扩展运算符。