2011-04-13 87 views
1

我不知道該字的最好方法這個問題是什麼,但基本上我期待創造這樣創建對象的一種循環:在一個循環中創建一個深(水平)對象

var dictionary = {}; 
var arr = [ 
       ["for", "item", "in", "list"], 
       ["if", "condition"] 
      ]; 

// Insert Magic Loop to yield: 

dictionary.for.item.in.list // {} (exists, as well as rest of chain) 
dictionary.if.condition  // {} (exists, as well as rest of chain) 
dictionary.for.item   // {} 
dictionary.test    // undefined 

回答

3

關閉我的頭頂:

function create(arrArray) { 
    for(var i = 0; i < arrArray.length; i++) { 
     var arr = arrArray[i]; 

     var _dict = dictionary; 

     for(var j = 0; j < arr.length; j++) { 
      if(!_dict[arr[j]]) { 
       _dict[arr[j]] = {}; 
      } 
      _dict = _dict[arr[j]]; 
     } 
    } 
} 

編輯

這裏是解決方案的一個子集。我寫了一個函數,它在陣列和字典作爲參數:

function create(arr, dict) {   
    var _dict = dict; 

    for(var j = 0; j < arr.length; j++) { 
     if(!_dict[arr[j]]) { 
      _dict[arr[j]] = {}; 
     } 
     _dict = _dict[arr[j]]; 
    } 
} 

var dictionary = {}; 

create(["for", "item", "in", "list"], dictionary); 
create(["if", "condition"], dictionary) 

如果你不擔心覆蓋,就可以取出if在循環:

function create(arr, dict) {   
    var _dict = dict; 

    for(var j = 0; j < arr.length; j++) { 
     _dict[arr[j]] = {}; 
     _dict = _dict[arr[j]]; 
    } 
} 

而對於更好的可讀性:

function create(arr, dict) {   
    var _dict = dict; 

    for(var j = 0; j < arr.length; j++) { 
     var key = arr[j]; 
     _dict[key] = {}; 
     _dict = _dict[key]; 
    } 
} 
+0

黨 - 非常感謝!這看起來不錯。我只是測試了這個 - Diggin'與if語句。這正是我正在尋找的 - 謝謝! – Matt 2011-04-13 19:59:49

2

這將需要一些修改(重新啓動在頂部每個序列),但顯示降降的總體思路:

var arr = ["foo", "if", "then", "bar"] 
var dictionary = {} 
var obj = dictionary // keep original 
for (var i = 0; i < arr.length; i++) { 
    var key = arr[i] 
    // assign and "move to next". 
    // this could be done as `obj = obj[key] = {}` 
    obj[key] = {} 
    obj = obj[key] 
} 

快樂編碼

+0

我愛的男人如此..非常感謝您的幫助! – Matt 2011-04-13 19:50:56

+0

有關此解決方案的一個問題。字典如何結束一切?它看起來像對象是引用字典,但沒有對象覆蓋每次迭代? – Matt 2011-04-13 19:55:56

+0

@Matt是的,它會被覆蓋。你只需要適應pst的解決方案,並使其與我的類似。即將其包裝在接受字典作爲參數的函數中。 – 2011-04-13 19:59:26

2
var dictionary = {}, 
    arr = [ 
      ["for", "item", "in", "list"], 
      ["if", "condition"] 
    ]; 

// loop the outer array 
for (var x = 0; x < arr.length; x++) { 
    var current = dictionary, // set "current" to the top-level object (dictionary) 
     sub = arr[x];  // reference to sub-item 

    // loop sub-list 
    for (var y = 0; y < sub.length; y++) { 
     // create the new object on the "current" object, 
     // then assign that new object to be "current" 
     current = current[sub[y]] = {}; 
    } 
} 

console.log(dictionary); 
+0

這工作完美 - 謝謝你! – Matt 2011-04-13 20:04:20

3
var dictionary = {}; 
var arr = [ 
       ["for", "item", "in", "list"], 
       ["if", "condition"] 
      ]; 
for(var i in arr){ 
    var _i = arr[i]; 
    var x = dictionary; 
    for(var ii in _i){ 
     x[_i[ii]] = {}; 
     x = x[_i[ii]]; 
    } 
} 
console.log(dictionary); 
console.log(dictionary.for.item.in.list); 
console.log(dictionary.if.condition); 
console.log(dictionary.for.item); 
console.log(dictionary.test);