我正在尝试通过列出键的数组查找对象中的参数。 例如,给定一个对象 {a: {b: {c: 3}}} 和数组 ['a','b','c'],我正在寻找一个可以递归地查看对象并在这个例子返回 3。这很容易通过遍历数组并定义一个像这样的子对象来完成:
function keyChain(obj, chain) {
let subObject = obj;
for (let i = 0; i < chain.length; i++) {
if(subObject[chain[i]] !== undefined){
subObject = subObject[chain[i]];
}
}
return subObject;
}
但是,当您尝试编辑此参数时,问题就出现了。是否有任何函数(不使用 eval)可以保留深度引用或允许以其他方式编辑对象内的值?
我有一个工作功能可以用 eval 编辑值。但是,我正在通过这个函数运行不受信任的用户输入,所以如果存在其他更安全的解决方案,那将是更可取的。
function applyToKeyChain(obj, chain, value){
let lookUpString = '';
for(let i = 0; i < chain.length; i++){
loopUpString += '[' + chain[i] + ']';
}
eval(`obj${lookUpString} = value;`);
}
我还尝试通过 getter 和 setter 保留对对象的深度引用,并尝试跟踪数组中的每个子对象。循环遍历对象到最后一个键之前的一个键,然后手动查找键也不起作用。
关键是迭代遍历嵌套对象,直到(停在)最后一个元素。然后,很容易为链中的最后一个属性设置值。
function setNestedVal(obj, chain, val) {
const last = chain.pop();
chain.reduce((acc, k) => acc[k], obj)[last] = val;
}
let o = {a: {b: {c: 3}}};
setNestedVal(o, ['a','b','c'], 4);
console.log(o);