为什么并发拼合器只返回2个最内层的子节点

时间:2014-06-26 11:02:14

标签: javascript jquery concurrency tree

我无法弄清楚为什么这棵树'flattener'只返回最里面的孩子,期望它应该返回扁平的树。

var x = {
  "Fields": {
    "Id": "1",
    "MasterAccountId": "",
    "ParentAccountId": "",
    "Name": "Name 1"
  },
  "Children": [{
    "Fields": {
      "Id": "2",
      "MasterAccountId": "1",
      "ParentAccountId": "1",
      "Name": "Name 2"
    },
    "Children": [{
      "Fields": {
        "Id": "5",
        "MasterAccountId": "1",
        "ParentAccountId": "2",
        "Name": "Name 5"
      },
      "Children": [{
        "Fields": {
          "Id": "6",
          "MasterAccountId": "1",
          "ParentAccountId": "5",
          "Name": "Name 6"
        }
      }, {
        "Fields": {
          "Id": "7",
          "MasterAccountId": "1",
          "ParentAccountId": "5",
          "Name": "Name 7"
        }
      }]
    }]
  }]
}

  function recurs(n) {
    console.log(n.Fields.Name);
    return (n.Children != undefined ? $.map(n.Children, recurs) : n);
  }

var r = recurs(x);

它返回id为6,7的元素,而console.log则返回所有5个元素。

http://plnkr.co/edit/LdHiR86EDBnZFAh6aAlG?p=preview

1 个答案:

答案 0 :(得分:2)

如果n.Children未定义,则您的函数仅返回n。由于您需要一个包含所有对象的平面数组,因此需要构建一个。

function recurs(n) {
  var out = [];
  out.push(n.Fields);
  if (n.Children) {
    for (var i=0, c; c = n.Children[i]; i++) {
      out.push.apply(out, recurs(c));
    }
  }
  return out;
}