изменить массив объектов путем уменьшения - PullRequest
0 голосов
/ 03 мая 2020

У меня есть массив вроде ->

[{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"}]}, ....]

Я пишу функцию уменьшения ->

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

но возвращает только один элемент массива. Как я могу вернуть их все?

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Вы можете искать пользователя, используя Array.prototype.find, если он найден, это означает, что он уже обработан, и вы можете sh объект данных в существующем массиве, иначе создать новый объект и вставить его в аккумулятор:

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);
1 голос
/ 03 мая 2020
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
}, []);
...