如何在JavaScript上使用动态键设置嵌套对象

时间:2019-06-17 19:17:13

标签: javascript

let foo = {};

const key1 = 'a';
const key2 = 'b';
const key3 = 'c';

foo[key1][key2][key3] = [1, 2];

当我尝试做类似的事情时,我得到:

Uncaught TypeError: Cannot read property 'b' of undefined

5 个答案:

答案 0 :(得分:3)

必须先创建嵌套对象,然后才能在其中创建属性。

let foo = {}

const key1 = 'a'
const key2 = 'b'
const key3 = 'c'

foo[key1] = {};
foo[key1][key2] = {};
foo[key1][key2][key3] = [1, 2];
console.log(foo);

如果键列表是在数组中动态生成的,请参见Populate nested object from array?,以获取创建所有对象的功能。

答案 1 :(得分:3)

您还可以使用动态键创建文字对象。只需确保在必要的地方创建嵌套对象,如@Barmar所示。

const key1 = 'a'
const key2 = 'b'
const key3 = 'c'

let foo = { [key1]: { [key2]: { [key3]: [1, 2] } } };

console.log(foo.a.b.c);

答案 2 :(得分:1)

您可以创建一个带有三个参数的函数:

  • 将在其上添加键的对象。
  • 键的顺序排列。
  • 将被设置为最后一级的值。

使用forEach循环遍历键。除最后一个索引外,向键添加空{}。并将当前对象更改为该空对象。

let foo = {}

function nestedKey(obj,keys,value){
  keys.forEach((x,i) => {
    obj[x] = i === keys.length -1 ? value : {};
    obj = obj[x]
  })
}
nestedKey(foo,['a','b','c'],[1,2]);

console.log(foo)

答案 3 :(得分:1)

使用Array#reduce将使这成为可能,但是键必须在列表中,并且顺序相反。

const key1 = 'a'
const key2 = 'b'
const key3 = 'c'

const foo = [key3, key2, key1].reduce((a,c)=>({[c]:a}), [1, 2]);

console.log(foo);

答案 4 :(得分:1)

尝试(改进的Barmar answer,无需重复按键)

let foo = {}, t;

const key1 = 'a';
const key2 = 'b';
const key3 = 'c';

t= foo[key1]= {};
t= t[key2]= {};
t[key3]= [1, 2];

console.log(foo);
如果foo具有更多(嵌套)值,它们将被保存