使用Array.reduce()分组

时间:2018-11-20 13:54:08

标签: javascript arrays reduce

我有一个像这样的数组(打算进行一级嵌套)

const names = [
    [{
        name: "John",
        country: "USA"
    }, {
        name: "Mary",
        country: "UK"
    }], {
        name: "Paul",
        country: "USA"
    }
]

我想将其转换为

const groupBy = [{
        country: "USA",
        names: [{
            name: "John"
        }, {
            name: "Paul"
        }]
    },
    {
        country: "UK",
        names: [{
            name: "Mary"
        }]
    }
]

我想知道如何使用reduce()或其他方法来达到预期的结果?

1 个答案:

答案 0 :(得分:0)

您可以使用lodash flatten删除嵌套,但是我可以通过再次调用reduce来处理嵌套。 Lodash也有一个groupBy,但这为您提供了一个键对象,这不是您想要的。因此,这是一个非基于lib的解决方案,它支持数组的无限嵌套。

    const names = [[{
        name: "John",
        country: "USA"
    }, {
        name: "Mary",
        country: "UK"
    }], {
        name: "Paul",
        country: "USA"
    }];

    const reducer = (groupBy, el) => {

        if (Array.isArray(el)) {
            return el.reduce(reducer, groupBy);
        } else {
            const { country, ...rest } = el;
            const group = groupBy.find(el => el.country === country);
            if (group) {
                group.names.push(rest);
            } else {
                groupBy.push({
                    country,
                    names: [rest]
                })
            }
            return groupBy;
        }
    }

    const groupBy = names.reduce(reducer, []);

    console.log('groupBy:', groupBy);