繁体   English   中英

如何对对象数组中的相似属性求和

[英]How do I sum of similar properties in array of objects

我今天早些时候问了一个类似的问题,但是这个问题的output是不同的。 我第一次问错了:(

我有一个大数组,为了问题的目的我已经简化了

[
  {"item1": 3, "item40": 2},
  {"item1": 4, "item40": 8}
]

我想以这个结束,这是对象数组中每个相似属性的总和。 我尝试了很多。 做一个 forEach 里面有一个 forIn。 但我被困住了。 请帮忙:)

[7, 10]

 let arr = [ {"item1": 3, "item40": 2}, {"item1": 4, "item40": 8} ] const res = Object.keys(arr[0]).map(key => arr.reduce((acc, cur) => acc + parseInt(cur[key] || 0), 0)) console.log(res)

您首先需要获取所有数据项的一组键,因为每个键的顺序和外观可能与数据数组中的每个项不同。

然后你可以通过 map 的键来减少所有项目。

 const data = [ { "item1": 3, "item40": 2 }, { "item1": 4, "item40": 8 } ]; const keys = [...new Set(data.reduce((keys, obj) => [...keys, ...Object.keys(obj)], []))]; const summary = keys.map((key) => data.reduce((acc, item) => acc + (item[key] || 0), 0)); console.log(summary); // [ 7, 10 ]

最好保留键值对...

 const data = [ { "item1": 3, "item40": 2 }, { "item1": 4, "item40": 8 } ]; const keys = [...new Set(data.reduce((keys, obj) => [...keys, ...Object.keys(obj)], []))]; const summary = keys.map((key) => ({ key, value: data.reduce((acc, item) => acc + (item[key] || 0), 0) })); // [{"key": "item1", "value": 7}, {"key": "item40", "value": 10}] console.log(summary);

更新这里有一个更好的版本。 您减少项目,并且对于每个项目,您减少键。

 const data = [ { "item1": 3, "item40": 2 }, { "item1": 4, "item40": 8 } ]; const keys = [...new Set(data.reduce((keys, obj) => [...keys, ...Object.keys(obj)], []))]; const summary = data.reduce((values, item) => keys.reduce((acc, key) => ({...acc, [key]: acc[key] + (item[key] || 0)}), values, {})); console.log(summary); // { "item1": 7, "item40": 10 } console.log(Object.values(summary)); // [ 7, 10 ]

如果您对外部模块持开放态度,则可以使用lodash_.sumBy很好地做到这一点:

 const data = [ { item1: 3, item2: 4, item40: 2 }, { item1: 4, item2: 4, item40: 8 }, ]; let output = {} // final result stored here let keys = _.keys(data[0]) // or Object.keys(data[0]) // using the first object as a template to see what keys to search for keys.forEach(key => output[key] = _.sumBy(data, key)) // sum them up document.write(`<pre>${JSON.stringify(output, null, 4)}</pre>`)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script>

过去data[0]的对象是缺少键还是有其他键都没有关系,但请注意,只有在data[0]中找到的键才会被求和

这是一个使用Map来维护 object 属性的顺序的版本:

 const data = [{ item1: 3, item40: 2 }, { item1: 4, item40: 8 }, ]; const arr = // Array.from converts iterator from values() below to array Array.from( data.reduce((map, obj) => { // accumulate each object's values into map Object.entries(obj).forEach(([propName, value]) => { map.set(propName, (map.get(propName)? ? 0) + value); }); return map; }, new Map()) // extract all values from map into an iterator.values() ); console.log(arr); // [ 7, 10 ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM