[英]How to set nested object with dynamic keys on 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
您必須先創建嵌套對象,然后才能在其中創建屬性。
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);
如果在數組中動態生成鍵列表,請參閱從數組中填充嵌套對象? 用於創建所有對象的函數。
您還可以使用動態鍵創建文字對象。 只需確保在必要時創建嵌套對象,如@Barmar所示。
const key1 = 'a' const key2 = 'b' const key3 = 'c' let foo = { [key1]: { [key2]: { [key3]: [1, 2] } } }; console.log(foo.abc);
您可以創建一個帶有三個參數的函數:
使用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)
使用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);
嘗試(改進Barmar 答案,無需重復鍵)
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
有更多(嵌套)值,它們將被保存
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.