Javascript:如何更新嵌套的 json,给定关键路径,如 doc.field1.field2 作为字符串
Javascript: How to update a nested json, given the key PATH like doc.field1.field2 as string
我正在尝试更新作为输入给出的嵌套 JSON,例如:
{
"doc": {
"a1": {
"b1": 1,
"b2": [
"one",
"two"
]
},
"a2": "xyz"
}
}
JSON 结构未知。
要更新的字段是输入字符串,例如:“doc.a2”或“doc.a1.b1”或“doc.a1.b2”
除了路径,旧值和新值也作为输入。如果路径中的值与旧值匹配,我想用新值更新它。
我试过 eval()
似乎可行
如果路径是“doc.a1.b1”,则 eval(doc['a1']['b1']='new value')
;
但是使用eval
可能会导致安全问题。有没有更好的方法来实现这个?
不要重新发明轮子 - lodash's set
可以为您做到这一点:
_.set(objToUpdate, 'doc.a1.b1', 'new_value');
试试这个
var input1 = "doc.a2";
val1 = "val1";
updateVal(obj, input1, val1);
console.log("val1", obj);
function updateVal(obj, input, val) {
let props = input.split(".");
let currObj = obj;
let index = 0;
for (index = 0; index < props.length - 1; index++) {
currObj = currObj[props[index]];
};
currObj[props[index]] = val;
};
假设您不想依赖第三方库,这里有一个 5 行提案(它可能需要改进以解决极端情况,例如给定路径无效,具体取决于您希望如何处理这些情况,例如错误,或创建路径)。
// given: ///////////////////////////////////
const obj = {
"doc": {
"a1": {
"b1": 1,
"b2": [
"one",
"two"
]
},
"a2": "xyz"
}
}
const str = "doc.a1.b2"
const newValue = ["three"]
// do: ///////////////////////////////////////
const keys = str.split(".")
let ptr = obj
while(keys.length>1)
ptr = ptr[keys.shift()]
ptr[keys.shift()] = newValue
// result: ///////////////////////////////////
console.log(obj)
我正在尝试更新作为输入给出的嵌套 JSON,例如:
{
"doc": {
"a1": {
"b1": 1,
"b2": [
"one",
"two"
]
},
"a2": "xyz"
}
}
JSON 结构未知。
要更新的字段是输入字符串,例如:“doc.a2”或“doc.a1.b1”或“doc.a1.b2”
除了路径,旧值和新值也作为输入。如果路径中的值与旧值匹配,我想用新值更新它。
我试过 eval()
似乎可行
如果路径是“doc.a1.b1”,则 eval(doc['a1']['b1']='new value')
;
但是使用eval
可能会导致安全问题。有没有更好的方法来实现这个?
不要重新发明轮子 - lodash's set
可以为您做到这一点:
_.set(objToUpdate, 'doc.a1.b1', 'new_value');
试试这个
var input1 = "doc.a2";
val1 = "val1";
updateVal(obj, input1, val1);
console.log("val1", obj);
function updateVal(obj, input, val) {
let props = input.split(".");
let currObj = obj;
let index = 0;
for (index = 0; index < props.length - 1; index++) {
currObj = currObj[props[index]];
};
currObj[props[index]] = val;
};
假设您不想依赖第三方库,这里有一个 5 行提案(它可能需要改进以解决极端情况,例如给定路径无效,具体取决于您希望如何处理这些情况,例如错误,或创建路径)。
// given: ///////////////////////////////////
const obj = {
"doc": {
"a1": {
"b1": 1,
"b2": [
"one",
"two"
]
},
"a2": "xyz"
}
}
const str = "doc.a1.b2"
const newValue = ["three"]
// do: ///////////////////////////////////////
const keys = str.split(".")
let ptr = obj
while(keys.length>1)
ptr = ptr[keys.shift()]
ptr[keys.shift()] = newValue
// result: ///////////////////////////////////
console.log(obj)