2015-05-12 83 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的最后一个元素。

相关问题