[英]How can I create a nested object from a list of keys and a value?
我試圖想出一個腳本,它將獲取一組鍵和一個值並返回一個對象:
keys = ['a', 'b', 'c'];
value = 'hello';
我試圖得到這個:
{'a': {'b': {'c': 'hello'}}}
我的代碼:
var data = {};
for (var i=0; i < keys.length; i++) {
var key = keys[i];
if (i < keys.length -1) {
if (data[key] === undefined) {
data[key] = {};
}
} else {
data[key] = value;
}
data = data[key];
}
另外,我想確保任何已經包含在data
值中的data
在使用不同的密鑰時都不會被擦除。
您可以像這樣使用Array.prototype.reduceRight
var keys = ['a', 'b', 'c'];
var value = 'hello';
console.log(keys.reduceRight(function (pastResult, currentKey) {
var obj = {};
obj[currentKey] = pastResult;
return obj;
}, value));
// { a: { b: { c: 'hello' } } }
reduceRight
將從右到左處理數組。 每次我們創建一個新對象並將舊對象存儲在當前密鑰名稱中。 因此,當我們逐個迭代時,我們正在增加對象的嵌套。 我們將value
作為最后一個參數傳遞,這將是第一次用作pastResult
。
如果要修復原始代碼,只需停止為data
分配新對象並使用其他變量,如下所示
var keys = ['a', 'b', 'c'],
value = 'hello',
data = {},
temp = data;
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (i < keys.length - 1) {
if (temp[key] === undefined) {
temp[key] = {};
}
} else {
temp[key] = value;
}
temp = temp[key];
}
console.log(data)
// { a: { b: { c: 'hello' } } }
即使這樣也可以簡潔地寫成,就像這樣
for (var i = 0; i < keys.length - 1; i++) {
temp = (temp[keys[i]] = {});
}
temp[keys[keys.length - 1]] = value;
我們迭代除了最后一個keys
之外的所有keys
,並且每次都將新對象分配給當前鍵,因為我們將它分配回temp
,在下一次迭代時, temp
將引用新創建的對象。 最后,我們將value
分配給keys
的最后一個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.