【问题标题】:Reduce array of objects without using .push()在不使用 .push() 的情况下减少对象数组
【发布时间】:2021-02-23 13:02:25
【问题描述】:

我有这个对象数组:

[
    {
        user: 'User_1',
        date: 1603926000000,
        count: 3,
    },
    {
        user: 'User_2',
        date: 1603926000000,
        count: 10,
    },
    {
        user: 'User_2',
        date: 1604876400000,
        count: 1,
    },
]

我用这个函数减少它:

const reducedDataByDate = dataByDate.reduce((acc, d) => {
        const foundUser = acc.find((a) => a.user === d.user)
        const value = { date: formatDate(d.date), count: d.count }
        if (!foundUser) {
            acc.push({ user: d.user, data: [value] })
        } else {
            foundUser.data.push(value)
        }
        return acc
    }, [])

有了这个结果:

[
    {
        user: 'User_1',
        data: [
            {
                date: '2020-10-29',
                count: 10,
            },
            {
                date: '2020-11-09',
                count: 1,
            },
        ],
    },
    {
        user: 'User_2',
        data: [
            {
                date: '2020-10-29',
                count: 3,
            },
        ],
    },
]

理想情况下,我想摆脱将值推送到原始 accfoundUser 数组,但不知道如何去做。非常感谢任何输入!

【问题讨论】:

  • 你想要什么?
  • 感谢您的评论。我正在寻找一种不改变原始数组的方法。我猜一个函数 collectDataForUser 为特定用户收集所有数据,然后将结果添加到 acc/foundUser。
  • foundUser.data[foundUser.data.length] = value

标签: javascript arrays functional-programming


【解决方案1】:

您可以使用Map 收集数据并从中获取所需的格式。

const 
    data = [{ user: 'User_1', date: 1603926000000, count: 3 }, { user: 'User_2', date: 1603926000000, count: 10 }, { user: 'User_2', date: 1604876400000, count: 1 }],
    result = Array.from(
        data.reduce(
            (m, { user, ...o }) => m.set(user, [...(m.get(user) || []), o]),
            new Map
        ),
        ([user, data]) => ({ user, data })
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 谢谢,确实有效!但是,我真的不明白这里发生了什么([user, data]) => ({ user, data })。你能澄清一下吗?
  • Array.from 接受一个可迭代的映射,它与Map#entries 相同,它返回一个具有键/值对的数组数组,该数组使用键/user 映射和 value/data as short hand properties 用于新对象。
猜你喜欢
  • 2021-10-27
  • 2017-09-10
  • 2017-09-06
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多