通过 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
}, []);
我有一个类似 ->
的数组[{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
}, []);