sanjaykumar pushadapu
sanjaykumar pushadapu

Reputation: 43

Multi level grouping in javascript

[
    {
        "level1": 1,
        "level2": 1,
        "Id": 1
    },
    {
        "level1": 1,
        "level2": 1,
        "Id": 2
    },
    {
        "level1": 1,
        "level2": 2,
        "Id": 3
    },
    {
        "level1": 1,
        "level2": 2,
        "Id": 4
    },
    {
        "level1": 2,
        "level2": 1,
        "Id": 5
    },
    {
        "level1": 2,
        "level2": 1,
        "Id": 6
    },
    {
        "level1": 2,
        "level2": 2,
        "Id": 7
    },
    {
        "level1": 2,
        "level2": 2,
        "Id": 8
    }
]

output:-

[
    {
        "level1": 1,
        "level1List": [
            {
                "level2": 1,
                "level2List": [
                    {
                        "Id": 1
                    },
                    {
                        "Id": 2
                    }
                ]
            },
            {
                "level2": 2,
                "level2List": [
                    {
                        "Id": 3
                    },
                    {
                        "Id": 4
                    }
                ]
            }
        ]
    },
    {
        "level1": 2,
        "level1List": [
            {
                "level2": 1,
                "level2List": [
                    {
                        "Id": 5
                    },
                    {
                        "Id": 6
                    }
                ]
            },
            {
                "level2": 2,
                "level2List": [
                    {
                        "Id": 7
                    },
                    {
                        "Id": 8
                    }
                ]
            }
        ]
    }
]  

How to get above output with es6 or loadesh or other way?

Upvotes: 2

Views: 1395

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386680

You could take a nested aproach by using an object as hash table with all items for this level, denoted by _ property of this level.

var data = [{ level1: 1, level2: 1, Id: 1 }, { level1: 1, level2: 1, Id: 2 }, { level1: 1, level2: 2, Id: 3 }, { level1: 1, level2: 2, Id: 4 }, { level1: 2, level2: 1, Id: 5 }, { level1: 2, level2: 1, Id: 6 }, { level1: 2, level2: 2, Id: 7 }, { level1: 2, level2: 2, Id: 8 }],
    keys = ['level1', 'level2'],
    result = [],
    temp = { _: result };

data.forEach(function (a) {
    keys.reduce(function (r, k) {
        if (!r[a[k]]) {
            r[a[k]] = { _: [] };
            r._.push({ [k]: a[k], [k + 'list']: r[a[k]]._ });
        }
        return r[a[k]];
    }, temp)._.push({ Id: a.Id });
});
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 2

Related Questions