在给定查找键数组的对象中保留对值的深度引用

问题描述 投票:0回答:1

我正在尝试通过列出键的数组查找对象中的参数。 例如,给定一个对象 {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 保留对对象的深度引用,并尝试跟踪数组中的每个子对象。循环遍历对象到最后一个键之前的一个键,然后手动查找键也不起作用。

javascript lookup
1个回答
0
投票

关键是迭代遍历嵌套对象,直到(停在)最后一个元素。然后,很容易为链中的最后一个属性设置值。

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);

© www.soinside.com 2019 - 2024. All rights reserved.