【问题标题】:converting an array into a tree将数组转换为树
【发布时间】:2013-01-24 17:56:37
【问题描述】:

有人能解释一下这段代码吗?我不明白“for”结构中的内容。

 var tree = {}

function addToTree(tree, array) { 
   for (var i = 0, length = array.length; i < length; i++) {
       tree = tree[array[i]] = tree[array[i]] || {}
   }
}

addToTree(tree, ["a", "b", "c"])
addToTree(tree, ["a", "b", "d"])

/*{
    "a": {
        "b": {
            "c": {},
            "d": {}
        }
    }
}*/

【问题讨论】:

  • 呃……这段代码还能用吗?如果是这样,那么我也想知道发生了什么。
  • 它可以将数组转换为树,它就像一个对象树,注释代码是树的输出。这是原帖:stackoverflow.com/q/3663096/2007780
  • 我开始阅读您的代码并编写答案,但我无法得到与您相同的答案!在我看来,当这段代码运行时,tree 最后应该是一个空对象。

标签: javascript arrays tree


【解决方案1】:

我扩展了 for 循环的主体并添加了一些 cmets 以使事情更加明确。

for (var i = 0, length = array.length; i < length; i++) {
   // Assign the current item in the array to a variable
   var current = array[i];

   // If there is no property on the "tree" object corresponding to the value of 
   // "current", set this property to a new object
   if (!tree[current]) {
      tree[current] = {};
   }

   // Set the "tree" variable to the field in the "tree" object whose 
   // name corresponds to "current". On the next loop iteration, "tree" will
   // refer to this "child" object, resulting in a tree-like object being
   // created as we iterate.
   tree = tree[current];
}

【讨论】:

  • 哦,我明白了!一开始,我以为我们是在全局范围内重写tree的值,但tree也是函数参数的名称!
  • @DanielAllenLangdon 正确 - 这使得 OP 的帖子不必要地令人困惑,因为在 addToTree 范围内的 tree 的值将绑定到传入的任何内容,在原始示例中也会发生这种情况成为名为@9​​87654326@的全局变量。
【解决方案2】:

在函数内部对tree 的引用掩盖了具有相同名称的外部变量之前,这令人困惑。但是由于引用在 JavaScript 中的工作方式,它最终还是会修改外部变量。

这是它的作用,一步一步,只考虑第一次调用:

  1. tree(即{})和["a", "b", "c"]为参数调用函数
  2. 循环阵列。
    1. 检查树中是否已有属性“a”;如果没有,则使用值 {} 创建它
    2. 完整的树现在看起来像{ a : {} }
    3. 现在考虑我们正在处理的树是tree.a(它是空的)
    4. 检查当前树中是否已有属性“b”;如果没有,则使用值 {} 创建它
    5. 完整的树现在看起来像{ a : { b: {} } }
    6. 现在考虑我们正在处理的树是tree.a.b(它是空的)
    7. 检查当前树中是否已有属性“c”;如果没有,则使用值 {} 创建它
    8. 完整的树现在看起来像{ a : { b: { c: {} } } }
    9. 现在考虑我们正在处理的树是tree.a.b.c(它是空的)
  3. 函数结束

【讨论】:

  • 谢谢你的帮助,我很明白
猜你喜欢
  • 2015-12-09
  • 2011-05-18
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多