2011-04-13 91 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);