javascript中的多级分组

时间:2018-06-07 08:59:39

标签: javascript ecmascript-6

[
    {
        "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
    }
]

输出: -

[
    {
        "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
                    }
                ]
            }
        ]
    }
]  

如何使用es6loadesh或其他方式获得以上输出?

1 个答案:

答案 0 :(得分:1)

您可以将对象用作哈希表,并使用此级别的所有项目(由此级别的_属性表示)来采用嵌套方式。



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; }