首页 > 解决方案 > 改进嵌套的 forEach

问题描述

我有这个嵌套数组:

const users = [
    ['User_1', [[1596232800000, 4]]],
    [
        'User_2',
        [
            [1591567200000, 3],
            [1591653600000, 16],
        ],
    ],
]

并且想要这个输出:

const dataByDate = [
    {
        user: 'User_2',
        date: 1591567200000,
        count: 3,
    },
    {
        user: 'User_2',
        date: 1591653600000,
        count: 16,
    },
    {
        user: 'User_1',
        date: 1596232800000,
        count: 4,
    },
]

为了实现这一点,我正在这样做:


    const dataByDate: { date: string; count: number; user: string }[] = []

    users.forEach((user: string[]) => {
        if (user[1].length) {
            user[1].forEach((item: any) => {
                dataByDate.push({ date: item[0], user: user[0], count: item[1] })
            })
        }
    })

我的解决方案运行良好,但我想知道是否有比嵌套 forEach 更清洁、更优雅的解决方案。谢谢!

标签: javascriptarraysloopsforeach

解决方案


您可以使用.flatMap内部.map(). 内部.map()将获取内部数组的第二个元素(即:[[date, count], ...]数组),并将它们映射到对象。由于.map()将生成对象数组,因此您可以使用.flatMap()将生成的对象合并到一个最终生成的数组中。

请参见下面的示例:

const users = [
    ['User_1', [[1596232800000, 4]]],
    [
        'User_2',
        [
            [1591567200000, 3],
            [1591653600000, 16],
        ],
    ],
];

const result = users.flatMap(([user, arr]) => arr.map(([date, count]) => ({
  user, date, count
})));
console.log(result);

然后,您可以将该.sort()方法应用于输出数组的任何其他重新排序。


推荐阅读