首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将json数据的每个级别按其公共值之一分组

如何将json数据的每个级别按其公共值之一分组
EN

Stack Overflow用户
提问于 2018-10-16 06:50:34
回答 1查看 668关注 0票数 1

关于我的项目,我面临一些问题,我试图使用JSON数据构建一棵树,我有如下所示

代码语言:javascript
复制
var treeData = [
          {
            "name": "Root Node",
            "parent": "null",
            "children": [
              {
                "name": " Transport",
                "parent": "Root Node",
                "nodeId":"nod411",
                "children": [
                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nodjz13l"
                      },
                      {
                        "name": "Transport-2",
                        "parent": "Transport",
                        "nodeId":"nod411",
                        "children": [

                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nod1_cdot"
                          },
                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nod45jkl"
                          },
                          {
                            "name": "Bikes",
                            "parent": "Transport-2",
                            "nodeId":"nod411"
                          },
                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nod961"
                          },
                          {
                            "name": "Cars",
                            "parent": "Transport-2",
                            "nodeId":"nodm2m40"
                          },
                          {
                            "name": "Bikes",
                            "parent": "Transport-2",
                            "nodeId":"nod411"
                          },
                     ]
                  },
                  {
                    "name": "Cars",
                    "parent": "Transport",
                    "nodeId":"nod411"
                  },

                  {
                    "name": "Cars",
                    "parent": "Transport",
                    "nodeId":"nod311"
                  },
                  {
                    "name": "Bikes",
                    "parent": "Transport",
                    "nodeId":"nod411"
                  },
            ]
          },
          {
            "name": "Bikes",
            "parent": "Root Node",
            "nodeId":"nod411"
          }

        ]
      }
    ];

其中,我想根据它的值将类似的条目分组为键值对,如下所示。

代码语言:javascript
复制
var treeData = [
          {
            "name": "Root Node",
            "parent": "null",
            "children": [
              {
                "name": " Transport",
                "parent": "Root Node",
                "nodeId":"nod411",
                "children": [
                    {"key":"car","values":[
                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nodjz13l"
                      },
                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nod411"
                      },

                      {
                        "name": "Cars",
                        "parent": "Transport",
                        "nodeId":"nod311"
                      }
                     ]
                    },
                  {
                    "name": "Transport-2",
                    "parent": "Transport",
                    "nodeId":"nod411",
                    "children": [
                        {"key":"car","values":[
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nod1_cdot"
                              },
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nod45jkl"
                              },
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nod961"
                              },
                              {
                                "name": "Cars",
                                "parent": "Transport-2",
                                "nodeId":"nodm2m40"
                              }
                           ]
                        },
                        {"key":"Bikes","values":[
                              {
                                "name": "Bikes",
                                "parent": "Transport-2",
                                "nodeId":"nod411"
                              },
                              {
                                "name": "Bikes",
                                "parent": "Transport-2",
                                "nodeId":"nod411"
                              }
                            ]
                        }
                     ]
                  },
                  {"key":"Bikes","values":[
                  {
                    "name": "Bikes",
                    "parent": "Transport",
                    "nodeId":"nod411"
                  }
                ]
               }
            ]
          },
          {
            "name": "Bikes",
            "parent": "Root Node",
            "nodeId":"nod411"
          }

        ]
      }
    ];

我想在树的每个级别对数据进行分组。

我尝试使用d3作为嵌套

代码语言:javascript
复制
var treeDataByName = d3.nest()
        .key(function(d) { return d.name; })
        .entries(treeData);
console.log(JSON.stringify(treeDataByName));

然而,它只将根节点转换为键值对。

任何建议都会有帮助。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-16 09:42:10

您可以使用迭代(对于实际数组)和递归(带子)方法将每个数组按希望键分组。

代码语言:javascript
复制
function groupBy(array, key) {
    return array.reduce((r, o) => {
        var temp = r.find(g => g.key === o[key]),
            value = Object.assign({}, o, o.children && { children: groupBy(o.children, key) });

        if (temp) {
            temp.values.push(value);
        } else {
            r.push({ key: o[key], values: [value] });
        }
        return r;
    }, []);
}

var tree = [{ name: "Root Node", parent: "null", children: [{ name: " Transport", parent: "Root Node", nodeId: "nod411", children: [{ name: "Cars", parent: "Transport", nodeId: "nodjz13l" }, { name: "Transport-2", parent: "Transport", nodeId: "nod411", children: [{ name: "Cars", parent: "Transport-2", nodeId: "nod1_cdot" }, { name: "Cars", parent: "Transport-2", nodeId: "nod45jkl" }, { name: "Bikes", parent: "Transport-2", nodeId: "nod411" }, { name: "Cars", parent: "Transport-2", nodeId: "nod961" }, { name: "Cars", parent: "Transport-2", nodeId: "nodm2m40" }, { name: "Bikes", parent: "Transport-2", nodeId: "nod411" }] }, { name: "Cars", parent: "Transport", nodeId: "nod411" }, { name: "Cars", parent: "Transport", nodeId: "nod311" }, { name: "Bikes", parent: "Transport", nodeId: "nod411" }] }, { name: "Bikes", parent: "Root Node", nodeId: "nod411" }] }],
    result = groupBy(tree, 'name');

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52829459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档