响应中的对象分组数组。
我有这样的回应。
[ {name:someName, value:20},
{name:"", value:21}
{name:someName, value:25}
{name:someName , value:27}
{name:"", value:21}
{name:someName, value:20}
]
我想这样分组。
[ {name:someName, value:20},
{name:"", value:42}
{name:someName, value:25}
{name:someName , value:27}
{name:someName, value:20}
]
我尝试使用过滤器,减少Js中的功能
答案 0 :(得分:0)
您可以尝试使用reduce
const data = [
{name: 'someName', value:20},
{name: "", value:21},
{name: 'someName1', value:25},
{name: 'someName' , value:27},
{name: "", value:21},
{name: 'someName1', value:20},
];
const group = (data) =>
data.reduce((acc, { name, value }) => {
const item = acc.find((el) => el.name === name);
if (item) item.value += value;
else acc.push({ name, value });
return acc;
}, []);
console.log(group(data));
如果您只想对空名称进行分组,find
应该是:
const item = acc.find((el) => el.name === name && !name);
因为空字符串是falsy值。
答案 1 :(得分:0)
您可以将其简化为Map,然后使用该Map的值,然后将Array.prototype.map与reduce一起使用,以归纳各组:
const data = [
{ name: 'a', value: 20 },
{ name: '', value: 21 },
{ name: 'a', value: 25 },
{ name: 'b', value: 27 },
{ name: '', value: 21 },
{ name: 'c', value: 20 },
];
console.log(
[
...data
.reduce(
(result, item) =>
result.set(
item.name,
(result.get(item.name) || []).concat(item),
),
new Map(),
)
.values(),
].map((items) =>
items.reduce(
(result, item) =>
console.log(result, item) || {
name: item.name,
value: item.value + result.value,
},
),
),
);