层层嵌套的对象,如何拿到最底层的值?

比如有对象

a: {
    b: {
        c: {
            d: {
                f: 123
            }
        }
    }
}

我只能按照顺序拿到数组['a', 'b', 'c', 'd', 'f']
如果想给f赋值,
只能

expression[0][expression[1][expression[2][expression[3][expression[4]....]]]] = 456

如果想要写上面这个表达式的通用函数,要怎么写。

阅读 1.7k
avatarAI BotBETA

这个问题可以通过使用 JavaScript 中的递归函数来解决。以下是一个可能的解决方案:

function accessNestedObject(obj, path, value) {
    let keys = path.split('.');
    let key = keys[0];
    if (keys.length > 1) {
        obj[key] = {};
        accessNestedObject(obj[key], keys.slice(1).join('.'), value);
    } else {
        obj[key] = value;
    }
    return obj;
}

let expression = { a: { b: { c: { d: { f: 123 } } } } };
accessNestedObject(expression, 'a.b.c.d.f', 456);
console.log(expression); // { a: { b: { c: { d: { f: 456 } } } } }

这个 accessNestedObject 函数接受三个参数:一个对象,一个包含要访问的属性的路径,以及一个要设置的值。该函数将路径拆分成键的数组,然后逐个访问这些键,并在每个级别创建一个新的对象,如果路径中还有更多的键。当到达最深层的键时,该函数会设置给定的值。然后该函数返回修改后的对象。

在上面的例子中,我们首先创建了一个名为 expression 的对象,然后使用 accessNestedObject 函数将 f 属性的值设置为 456。然后我们打印出 expression,可以看到 f 的值已经被成功更改。

2 个回答
function setValue(object, path, value) {
    let current = object;
    for (let i = 0; i < path.length - 1; i++) {
        current = current[path[i]];
    }
    current[path[path.length - 1]] = value;
}

let a = {
    b: {
        c: {
            d: {
                f: 123
            }
        }
    }
};

let path = ['b', 'c', 'd', 'f'];
setValue(a, path, 456);

console.log(a.b.c.d.f); // 输出: 456
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题