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
答案 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
具有更多(嵌套)值,它们将被保存