从数组中查找父级和子级

问题描述 投票:0回答:2

假设我有这个数组:

[
      {
        "depth": 0,
        "id": "f35vz2f"
      },
      {
        "depth": 0,
        "id": "f359354"
      },
      {
        "depth": 1,
        "id": "f35e0b0",
        "parent_id": "f359354"
      },
      {
        "depth": 2,
        "id": "f35ji24",
        "parent_id": "f35e0b0"
      },
      {
        "depth": 2,
        "id": "f35rnwb",
        "parent_id": ""
      },
      {
        "depth": 2,
        "id": "f35ojh4",
        "parent_id": "f35e0b0"
      },
      {
        "depth": 3,
        "id": "f35lmch",
        "parent_id": "f35ji24"
      },
      {
        "depth": 3,
        "id": "f35kl96",
        "parent_id": "f35ji24"
      }
]

在此数组中,某些项目是父项,而有些则是其子项。

我想找到父母(深度为0)和他们的孩子(嵌套为深度1-深度2 ---深度3),然后推到另一个数组。

到目前为止,我所做的是:

const parent = comments.filter(cm => cm.depth == 0);
final = [];
final = parent;

comments.forEach(a =>
                    {
                        final.forEach(c =>
                        {
                            if(c.id == a.parent_id){
                                c.child = []
                                c.child.push(a);
                            }
                        })
            }) 

但是这仅适用于深度0和深度1,不知道如何处理更多深度。这是小提琴:http://jsfiddle.net/s3x5f4ap/2/

提前感谢

javascript arrays json
2个回答
0
投票

您可以收集节点的所有关系并建立一棵树。

var data = [{ depth: 0, id: "f35vz2f" }, { depth: 0, id: "f359354" }, { depth: 1, id: "f35e0b0", parent_id: "f359354" }, { depth: 2, id: "f35ji24", parent_id: "f35e0b0" }, { depth: 2, id: "f35rnwb", parent_id: "" }, { depth: 2, id: "f35ojh4", parent_id: "f35e0b0" }, { depth: 3, id: "f35lmch", parent_id: "f35ji24" }, { depth: 3, id: "f35kl96", parent_id: "f35ji24" }],
    tree = function (data, root) {
        var t = {};
        data.forEach(o => {
            Object.assign(t[o.id] = t[o.id] || {}, o);
            t[o.parent_id] = t[o.parent_id] || {};
            t[o.parent_id].children = t[o.parent_id].children || [];
            t[o.parent_id].children.push(t[o.id]);
        });
        return t[root].children;
    }(data, undefined);

console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0
投票

[如果您只是想轻松地查找父母,最简单的方法是将id添加为字典的键(假设您将数组包含在名为data的变量中:]

var array_to_dict = function (arr, key) {
  var dict = {};
  arr.forEach(item => dict[item[key]] = item);
  return dict;
};
data = results_to_dict(data, 'id');

现在,如果您正在处理某项,则父项为:

var parent = data[item.parent_id];

并且如果您想找到它的孩子:

var children = data.filter(x => x.parent_id == item.id);

如果要以树状结构结束,我将首先按级别划分,然后从最深的级别开始将每个项目附加到其父项,直到达到深度1。

© www.soinside.com 2019 - 2024. All rights reserved.