在来自响应的对象的角度组数组中?

时间:2019-02-25 12:44:59

标签: javascript angular typescript

响应中的对象分组数组。

我有这样的回应。

[ {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中的功能

2 个答案:

答案 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,
        },
    ),
  ),
);