2014-07-22 39 views
2

我有這樣的數組:轉換JS數組字典地圖

["userconfig", "general", "name"] 

,我想它看起來像這樣

data_structure["userconfig"]["general"]["name"] 

我已經試過這個功能:

inputID = "userconfig-general-name" 

function GetDataByID(inputID){ 

    var position = ''; 

    for (var i = 0; i < inputID.length; i++) { 
     var hirarchy = inputID[i].split('-'); 

     for (var index = 0; index < hirarchy.length; index++) { 
      position += '["'+ hirarchy[index] +'"]'; 
     } 
    } 
    return data_structure[position]; 
} 

hirarchy是數組。我得到[position]作爲一個字符串,它運行不正常。

我該如何製作一個js函數,它通過數組動態地構建對象路徑?

+0

你有什麼嘗試嗎? – KooiInc

+3

嘗試使用遞歸 – hindmost

+0

這樣的結構會有什麼價值? –

回答

0

的下面功能將填充有所需的屬性的對象,以修改和陣列:

function objPath(obj,path){ 
    path.forEach(function(item){ 
     obj[item] = {}; 
     obj = obj[item]; 
    }); 
} 

var myobj = {}; 
objPath(myobj,["test","test2","test3"]); 

console.log(myobj); 
//outputs 
Object {test: Object} 
    test: Object 
     test2: Object 
      test3: Object 

功能循環陣列創建新對象屬性作爲新的對象上。然後它將對新對象的引用放入obj中,以便可以創建新對象上的下一個屬性。

JSFiddle

2
var arr = ["userconfig", "general", "name"]; 
var dataStructure = arr.reduceRight(function (value, key) { 
    var obj = {}; 
    obj[key] = value; 
    return obj; 
}, 'myVal'); 

結束爲:

{ userconfig : { general : { name : 'myVal' } } } 

注意,你可能需要填充工具爲reduceRight方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight

+0

不錯,+1。注意:'arr.reverse()。reduce(/ * same callback * /,'myVal')'是等價的 – KooiInc

0

遞歸函數

var array = ["userconfig", "general", "name"]; 

function toAssociative(array) { 
    var index = array.shift(); 
    var next = null; 
    if (array.length > 0) { 
     next = toAssociative(array); 
    } 

    var result = new Array(); 
    result[index] = next; 

    return result; 
}