簡體   English   中英

如何從鍵列表和值創建嵌套對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM