【问题标题】:Set nested value of object without knowing amount of keys given [duplicate]在不知道给定键数量的情况下设置对象的嵌套值[重复]
【发布时间】:2017-11-07 03:54:25
【问题描述】:

我有一个函数可以获取任意大小的数组以及一个值。该函数应该将给定的键应用于具有嵌套对象的对象,然后将最后一个键设置为给定的值。然后它将对象存储在其他地方。

当密钥的数量已知且一致 (object[key1][key2][key3] = value) 时,这很容易做到,但是当给定的密钥数量未知时,这似乎是不可能的。

我知道我不能这样做

let foo = object[stack[0]];
stack.slice(1).forEach(key => foo = foo[key]);
foo = value;

因为这最终会重新分配foo
我想做的是能够做object[stack] = value之类的事情,或者类似的事情。

编辑
似乎人们将其解释为 get 嵌套值,这不是我想要的。我想设置一个嵌套值。

询问者的示例数据

let stack = ['a', 'b', 'c', 'd'];
let object = {
    a: {
        b: {
            c: {
                d: 'Lorem'
            }
        }
    }
}

// Do something that sets object.a.b.c.d to 'Lorem ipsum' (that isn't reliant on the number of keys)

console.log(object);
/*
    {
        a: {
            b: {
                c: {
                    d: 'Lorem ipsum'
                }
            }
        }
    }
*/

【问题讨论】:

  • 所以你有一个键数组,你想要一些有效的方法来连续应用每个键以获得最终的嵌套值?
  • 这有点混乱,你能说清楚一点吗?也许向我们展示更多数据,或者你的数组可能看起来像你回来的样子
  • 一个有点令人困惑的问题,但我猜你需要对此使用递归。我有一个类似的问题,通过递归解决了。 stackoverflow.com/questions/44103268/…
  • 编辑问题以包含示例数据。
  • 您能否也包括示例输出,您希望输出得到示例数据的内容。

标签: javascript node.js


【解决方案1】:

所以事实证明,我不能像我想的那样搜索,而且我对 JavaScript 指针的理解也没有我应该理解的那么好。

我设法找到了this answer,这正是我想要的。

处理我需要的简化和编辑版本

let stack = ['a', 'b', 'c', 'd'];
let object = {
    a: {
        b: {
            c: {
                d: 'Lorem'
            }
        }
    }
};
let ref = object; // This becomes a pointer to `object`.

// Loop through all the keys and change `ref` so that it becomes a pointer to each nested value.
stack.slice(0, -1).forEach(key => ref = ref[key]);

// Sets the last given key.
ref[stack.slice(-1)[0]] = 'Lorem ipsum';

console.log(object);
/*
    {
        a: {
            b: {
                c: {
                    d: 'Lorem ipsum'
                }
            }
        }
    }
*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2019-10-14
    • 2021-06-28
    • 2015-01-23
    相关资源
    最近更新 更多