通过 reduce 修改对象数组

modify array of objects by reduce

我有一个类似 ->

的数组
[{amount: 5000, date: "2020-04", user: "Bill Gates"}, {amount: 5000, date: "2020-04", user: "Jon Jones"}, {amount: 5000, date: "2020-05", user: "Jon Jones"}, {amount: 5000, date: "2020-05", user: "Bill Gates"}, ...]

而我想修改为 ->

[{user: "Bill Gates", data: [{amount: 5000, date: "2020-04"}, {amount: 5000, date: "2020-05"}]}, {user: "Jon Jones", data: [{amount: 5000, date: "2020-04"}, {amount: 5000, date: "2020-05"}]}, ....]

我写了reduce函数->

let reduced = array.reduce((sells, {user, date, amount}) => ({
    ...sells,
    user: user,
    data: [{date: date, amount: amount}],
}),{});

但它 return 只是数组的一项。我怎样才能 return 所有这些?

您可以使用 Array.prototype.find 搜索用户,如果发现这意味着它已经被处理,您可以将数据对象推送到现有数组中,否则创建一个新对象并将其插入累加器:

const data = [{amount: 5000, date: "2020-04", user: "Bill Gates"}, {amount: 5000, date: "2020-04", user: "Jon Jones"}, {amount: 5000, date: "2020-05", user: "Jon Jones"}, {amount: 5000, date: "2020-05", user: "Bill Gates"}];

const result = data.reduce((sells, {user, date, amount}) => {
   let match = sells.find(e => e.user === user);
   if(match){
      match.data.push({amount, date});
   }else{
      match = {user, data : [{amount, date}]};
      sells.push(match);
   }
   return sells;
}, []);
console.log(result);

input.reduce((acc, {user, amount, date}) => {
    const userToExtend = acc.find(u => u.user === user)
    if(userToExtend) userToExtend.data.push[{amount, date}]
    else acc.push({user, data: [{amount, date}]});
    return acc
}, []);