我正在try 通过列出键的数组来查找对象中的参数. 例如,给定一个对象{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;
}

但是,当您try 编辑此参数时会出现问题.有没有什么函数可以保留深度引用,或者允许以其他方式编辑对象内部的值?

我有一个可用来编辑值的工作函数.但是,我正在通过这个函数运行不受信任的用户输入,所以如果有其他更安全的解决方案,那将是更好的.

function applyToKeyChain(obj, chain, value){
    let lookUpString = '';
    for(let i = 0; i < chain.length; i++){
        loopUpString += '[' + chain[i] + ']';
    }
    eval(`obj${lookUpString} = value;`);
}

我还try 通过getter和setters保留对对象的深度引用,并try 跟踪数组中的每个子对象.在对象中循环到最后一个关键点之前的一个关键点,然后手动查找关键点也不起作用.

推荐答案

关键是迭代地遍历嵌套的对象,直到(在最后一个元素之前停止).然后,设置链中最后一个属性的值就很简单了.

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

Javascript相关问答推荐

如何在ReactJS中修复这种不需要的按钮行为?

获取表格的左滚动位置

使用print This时, map 容器已在LeafletJS中初始化

React Code不在装载上渲染数据,但在渲染上工作

如何找出摆线表面上y与x相交的地方?

数字时钟在JavaScript中不动态更新

在使用HighChats时如何避免Datatables重新初始化错误?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

如何在Node.js中排除导出的JS文件

在FAQ Accodion应用程序中使用React useState时出现问题

如何在DYGRAPS中更改鼠标事件和键盘输入

Next.js中的服务器端组件列表筛选

将基元传递给THEN处理程序

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

在Java脚本中录制视频后看不到曲目

JavaScript -复制到剪贴板在Windows计算机上无效

select 2-删除js插入的项目将其保留为选项

为什么在运行于<;img>;事件处理程序中的JavaScript中x和y是不可变的?

限制数组中每个元素的长度,

使用静态函数保存 node 前的钩子