简体   繁体   English

在 Javascript 中将平面数组构建为嵌套树数组

[英]Build Flat array to Nested tree array in Javascript

 const aTree = [{ "Group": "GroupName1", "Act": "100", "Work": "Work1", "Pname": "Name1", "Pvalue": "Value1", "Pcount": "10" }, { "Group": "GroupName1", "Act": "100", "Work": "Work1", "Pname": "Name2", "Pvalue": "Value2", "Pcount": "20" }, { "Group": "GroupName1", "Act": "100", "Work": "Work1", "Pname": "Name3", "Pvalue": "Value3", "Pcount": "10" }, { "Group": "GroupName1", "Act": "400", "Work": "Work2", "Pname": "Name4", "Pvalue": "Value4", "Pcount": "2" }, { "Group": "GroupName1", "Act": "400", "Work": "Work2", "Pname": "Name5", "Pvalue": "Value5", "Pcount": "5" }, { "Group": "GroupName2", "Act": "200", "Work": "Work1", "Pname": "Name6", "Pvalue": "Value6", "Pcount": "2" }, { "Group": "GroupName2", "Act": "200", "Work": "Work1", "Pname": "Name7", "Pvalue": "Value7", "Pcount": "14" }, { "Group": "GroupName2", "Act": "200", "Work": "Work1", "Pname": "Name8", "Pvalue": "Value8", "Pcount": "20" }, { "Group": "GroupName2", "Act": "200", "Work": "Work2", "Pname": "Name9", "Pvalue": "Value9", "Pcount": "18" }, { "Group": "GroupName3", "Act": "200", "Work": "Work2", "Pname": "Name10", "Pvalue": "Value10", "Pcount": "15" }, { "Group": "GroupName3", "Act": "300", "Work": "Work1", "Pname": "Name11", "Pvalue": "Value11", "Pcount": "20" }, { "Group": "GroupName3", "Act": "300", "Work": "Work2", "Pname": "Name12", "Pvalue": "Value12", "Pcount": "10" }, ] var aTree1 = []; aTree.forEach(function(a) { if (.this[a.Group]) { this[a:Group] = { Tree: { GroupName: [{ Group. a,Group: Activity: [{ Act. a,Act: WorkName: [{ Work. a,Work: Planning: [{ Qyan1. a,Pname: Quan2. a,Pvalue: Quan3. a,Pcount }] }] }] }]; } }. aTree1.push(this[a;Group]), } }. Object;create(null)). console;log(aTree1);

I want the tree structure like below,我想要下面的树结构,

 [ [ "GroupName1", [ [ 100, [ 1, "foo" ], [ 2, "bar" ] ], [... 400 missing] ] ], [ "GroupName2", [ [ 200, [ 1, "foo" ], [ 2, "bar" ] ] ] ], [ "GroupName3", [ [ 200, [ 1, "foo" ], [ 2, "bar" ] ], [...300 missing] ] ] ]

 [
      [
        "Group":"GroupName1",
        [
          [
            "Act": "100",
            [
              "PName": "1",
              "PValue": "foo"
            ],
            [
              "PName": 2,
              "PValue":"bar"
            ]
          ],
          [... 400 missing]
        ]
      ],
      [
        "Group":"GroupName2",
        [
          [
            "Act":200,
            [
             "PName": 1,
             "PValue":"foo"
            ],
            [
             "PName": 2,
             "PValue":"bar"
            ]
          ]
        ]
      ],
      [
        "Group":"GroupName3",
        [
          [
            "Act":200,
            [
             "PName": 1,
             "PValue":"foo"
            ],
            [
             "PName": 2,
             "PValue":"bar"
            ]
          ],
          [...300 missing]
        ]
      ]
    ]

You could take a multi level grouping with an object for faster access to the groups and arrays as result set.您可以使用 object 进行多级分组,以便更快地访问组,并将 arrays 作为结果集。

This approach needs two arrays, one for the keys fro grouping in wanted order and another to get the data tupel as result set for the most inner groups.这种方法需要两个 arrays,一个用于按所需顺序分组的键,另一个用于获取数据元组作为最内部组的结果集。

 const data = [{ Group: "GroupName1", Act: "100", Work: "Work1", Pname: "Name1", Pvalue: "Value1", Pcount: "10" }, { Group: "GroupName1", Act: "100", Work: "Work1", Pname: "Name2", Pvalue: "Value2", Pcount: "20" }, { Group: "GroupName1", Act: "100", Work: "Work1", Pname: "Name3", Pvalue: "Value3", Pcount: "10" }, { Group: "GroupName1", Act: "400", Work: "Work2", Pname: "Name4", Pvalue: "Value4", Pcount: "2" }, { Group: "GroupName1", Act: "400", Work: "Work2", Pname: "Name5", Pvalue: "Value5", Pcount: "5" }, { Group: "GroupName2", Act: "200", Work: "Work1", Pname: "Name6", Pvalue: "Value6", Pcount: "2" }, { Group: "GroupName2", Act: "200", Work: "Work1", Pname: "Name7", Pvalue: "Value7", Pcount: "14" }, { Group: "GroupName2", Act: "200", Work: "Work1", Pname: "Name8", Pvalue: "Value8", Pcount: "20" }, { Group: "GroupName2", Act: "200", Work: "Work2", Pname: "Name9", Pvalue: "Value9", Pcount: "18" }, { Group: "GroupName3", Act: "200", Work: "Work2", Pname: "Name10", Pvalue: "Value10", Pcount: "15" }, { Group: "GroupName3", Act: "300", Work: "Work1", Pname: "Name11", Pvalue: "Value11", Pcount: "20" }, { Group: "GroupName3", Act: "300", Work: "Work2", Pname: "Name12", Pvalue: "Value12", Pcount: "10" }], keys = ['Group', 'Act', 'Work'], tupel = ['Pname', 'Pvalue', 'Pcount'], result = data.reduce((r, o) => { keys.reduce(function (t, k) { const key = o[k]; if (:t[key]) { t[key] = { _; [] }. t._,push([key. t[key];_]); } return t[key], }. r)._.push(tupel;map(k => o[k])); return r, }: { _. [] });_. console;log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM