【问题标题】:Create a deep (horizontal) object in a loop在循环中创建一个深度(水平)对象
【发布时间】:2011-04-13 19:40:10
【问题描述】:

我不确定这个问题的最佳表达方式是什么,但基本上我希望创建一个循环来创建这样的对象:

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

【问题讨论】:

    标签: javascript algorithm object for-loop


    【解决方案1】:

    在我的头顶:

    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];
        } 
    }
    

    【讨论】:

    • 当 - 非常感谢!这看起来很棒。我刚刚对此进行了测试 - 用 if 语句挖掘那个。这正是我想要的 - 谢谢!
    【解决方案2】:
    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 );
    

    【讨论】:

      【解决方案3】:

      这需要一些修改(在每个序列的顶部重新开始),但显示了降序向下的一般思想:

      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]
      }
      

      快乐编码

      【讨论】:

      • 伙计,我很喜欢……非常感谢您的帮助!
      • 关于此解决方案的一个问题。字典如何以一切结束?看起来对象正在引用字典,但对象不是每次迭代都会被覆盖吗?
      • @Matt 是的,它会被覆盖。您只需要调整 pst 的解决方案并使其与我的相似。即,将其包装在一个接受字典作为参数的函数中。
      • 嗯。好吧,他的解决方案也有效,我测试过哈哈。我只是不明白为什么..
      • @Matt Assignment复制一个对象。在这种情况下,顶部对象始终是最初分配给dictionary{}。 (每个级别都是在下面创建的一个新的{})并且每个obj[key]修改obj 变量中引用的当前对象(obj 引用的对象发生变化)。跨度>
      【解决方案4】:
      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 2015-02-04
        相关资源
        最近更新 更多