2016-02-29 121 views
1

我有以下陣列:轉換數組對象中的JavaScript

["recordList", "userList", "lastChanged"] 

我想是這樣的:

lastChangedValue = "231231443234";   

var object = {}; 

object = { 
    recordList: { 
     userList: { 
     lastChanged: lastChangedValue 
     } 
    } 
} 

我怎麼能這樣做呢? 在此先感謝。

+0

解決是嵌套一致? – lintmouse

+0

所以你希望每個數組項都是一個包含它下面的鍵作爲鍵的對象? – Marie

回答

1

您可以通過屬性名稱迭代並在每個迭代中創建新對象的上一層嵌套:

var props = ["recordList", "userList", "lastChanged"]; 
var lastChangedValue = "231231443234"; 

var obj = {} 
var nested = obj; 
props.forEach(function(o, i) { 
    nested[o] = i === props.length - 1 ? lastChangedValue : {}; 
    nested = nested[o]; 
}); 

console.log(obj); 
2

試試這個:

var array = ["recordList", "userList", "lastChanged"]; 
 

 

 
var value = "231231443234";   
 

 
function arrayToObject(array, object, value) { 
 
    var ref = object; 
 
    for (var i=0; i<array.length-1; ++i) { 
 
    if (!ref[array[i]]) { 
 
     ref[array[i]] = {}; 
 
    } 
 
    ref = ref[array[i]] 
 
    } 
 
    ref[array[array.length-1]] = value; 
 
    return object; 
 
} 
 
alert(JSON.stringify(arrayToObject(array, {}, value)));

1

可能有一堆的方法來做到這一點,一種方法是減少

var keys = ["recordList", "userList", "lastChanged"]; 
var temp = keys.slice().reverse(), 
    lastChangedValue = "231231443234"; 
var result = temp.reduce(function (obj, val, ind, arr) { 
    if (ind===0) { 
    obj[val] = lastChangedValue; 
    return obj; 
    } else { 
    var x = {}; 
    x[val] = obj; 
    return x; 
    } 
}, {}); 
console.log(result); 
+0

請記住,在IE10中引入了減少並且在IE9或更低版本中不支持。 – Marie

1

遞歸

var fields = ["recordList", "userList", "lastChanged"]; 
 
lastChangedValue = "231231443234"; 
 
var object = {}; 
 

 
(function addFields(o, i, v) { 
 
    if (i == fields.length - 1) { 
 
     o[fields[i]] = v; 
 
     return; 
 
    } 
 
    o[fields[i]] = {}; 
 
    addFields(o[fields[i]], ++i, v) 
 
})(object, 0, lastChangedValue); 
 

 

 
alert(JSON.stringify(object));