首页 > 解决方案 > 通过 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}],
}),{});

但它只返回一项数组。我怎样才能将它们全部归还?

标签: javascriptarraysalgorithmreduce

解决方案


您可以使用 if found 搜索用户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);


推荐阅读