1

        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]
        ]
      ]
    ]
moor
  • 45
  • 6

1 Answers1

0

You could take a multi level grouping with an object for faster access to the groups and arrays as result set.

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.

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; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
  • Hi Nina Scholz, thanks for your reply, Now, im trying to expand my nested tree structure by adding the json format like, [ "GroupName" : "GroupName1" ] [ "Act": "100"] ["Work": "Work1" ] ["Pname": "Name1", "Pvalue": "Value2", "Pcount": 10]. Is it possible in tree array? kindly sugges. – moor Jun 12 '21 at 11:37
  • if i would know, what data type you want with wanted properties, i could add another solution. but for taking yourself, you just need to replace `[key, t[key]._]` with an object and push a new object instead of `tupel.map(k => o[k])`. – Nina Scholz Jun 12 '21 at 13:21
  • Hi @Nina-Scholz, i have tried to push the object like you mentioned. But, i'm not new structure which i mentioned in the post. Can you please suggest. – moor Jun 13 '21 at 04:49
  • your given structure is not valid. please add a valid (object with properties) to the question, or better ask a new question. – Nina Scholz Jun 13 '21 at 06:54