2015-05-12 106 views
2

我想拿出一個腳本,將採取的按鍵陣列和一個值,並返回一個對象:如何從鍵和值列表中創建嵌套對象?

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值的任何數據將不會被刪除時,它採用的是不同的ent key。

回答

10

您可以使用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除了最後一個,並分配一個新的對象到當前的關鍵每次和,因爲我們分配回temp,在下一次迭代temp將引用新創建的對象。最後,我們將value分配給keys的最後一個元素。

相關問題