Javascript 如何计算对象数组中相似属性的总和

Javascript 如何计算对象数组中相似属性的总和,javascript,arrays,sum,Javascript,Arrays,Sum,今天早些时候我问了一个类似的问题,但这个问题的结果不同。我第一次问错了:( 我有一个大数组,为了提问的目的,我对它进行了简化 [ {"item1": 3, "item40": 2}, {"item1": 4, "item40": 8} ] 我想以这个结束,它是对象数组中每个相似属性的总和。我尝试了很多。用一个forIn做了一个forEach。但是我被卡住了。请帮助:) [7,10] 让arr=[ {“第1项

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

我有一个大数组,为了提问的目的,我对它进行了简化

[
  {"item1": 3, "item40": 2},
  {"item1": 4, "item40": 8}
]
我想以这个结束,它是对象数组中每个相似属性的总和。我尝试了很多。用一个forIn做了一个forEach。但是我被卡住了。请帮助:)

[7,10]

让arr=[
{“第1项”:3,“第40项”:2},
{“第1项”:4,“第40项”:8}
]
const res=Object.keys(arr[0]).map(key=>arr.reduce((acc,cur)=>acc+parseInt(cur[key]| | 0),0))
console.log(res)
让arr=[
{“第1项”:3,“第40项”:2},
{“第1项”:4,“第40项”:8}
]
const res=Object.keys(arr[0]).map(key=>arr.reduce((acc,cur)=>acc+parseInt(cur[key]| | 0),0))

console.log(res)
首先需要在所有数据项中获取一组键,因为每个键的顺序和外观可能与数据数组中的每个项不同

然后,您可以将关键点映射到所有项目的缩减

const data=[{“item1”:3,“item40”:2},{“item1”:4,“item40”:8}];
const keys=[…新设置(data.reduce)((keys,obj)=>
[…键,…对象.键(obj)],[])];
const summary=keys.map((key)=>
数据减少((acc,项目)=>acc+(项目[关键]| 0),0));

console.log(摘要);//[7,10]
首先需要在所有数据项中获取一组键,因为每个键的顺序和外观可能与数据数组中的每个项不同

然后,您可以将关键点映射到所有项目的缩减

const data=[{“item1”:3,“item40”:2},{“item1”:4,“item40”:8}];
const keys=[…新设置(data.reduce)((keys,obj)=>
[…键,…对象.键(obj)],[])];
const summary=keys.map((key)=>
数据减少((acc,项目)=>acc+(项目[关键]| 0),0));

console.log(摘要);//[7,10]
如果您对外部模块开放,您可以通过
lodash
很好地做到这一点:

const数据=[
{项目1:3,项目2:4,项目40:2},
{项目1:4,项目2:4,项目40:8},
];
让输出={}//最终结果存储在这里
使用第一个对象作为模板,让keys=\.keys(数据[0])//或Object.keys(数据[0])//查看要搜索的键
keys.forEach(key=>output[key]=\.sumBy(data,key))//求和
document.write(`${JSON.stringify(output,null,4)}`)

如果您对外部模块开放,您可以通过
lodash
的以下功能很好地实现这一点:

const数据=[
{项目1:3,项目2:4,项目40:2},
{项目1:4,项目2:4,项目40:8},
];
让输出={}//最终结果存储在这里
使用第一个对象作为模板,让keys=\.keys(数据[0])//或Object.keys(数据[0])//查看要搜索的键
keys.forEach(key=>output[key]=\.sumBy(data,key))//求和
document.write(`${JSON.stringify(output,null,4)}`)

以下是一个版本,它使用
Map
来维护对象属性的顺序:

const数据=[{
项目1:3,
项目40:2
},
{
项目1:4,
项目40:8
},
];
康斯塔尔=
//Array.from将迭代器从下面的值()转换为数组
Array.from(
数据
.reduce((映射,对象)=>{
//将每个对象的值累积到地图中
Object.entries(obj.forEach)([propName,value])=>{
map.set(propName,(map.get(propName)??0)+值);
});
返回图;
},新映射())
//将映射中的所有值提取到迭代器中
.values()
);

console.log(arr);//[7,10]
这里有一个版本,它使用
Map
来维护对象属性的顺序:

const数据=[{
项目1:3,
项目40:2
},
{
项目1:4,
项目40:8
},
];
康斯塔尔=
//Array.from将迭代器从下面的值()转换为数组
Array.from(
数据
.reduce((映射,对象)=>{
//将每个对象的值累积到地图中
Object.entries(obj.forEach)([propName,value])=>{
map.set(propName,(map.get(propName)??0)+值);
});
返回图;
},新映射())
//将映射中的所有值提取到迭代器中
.values()
);

console.log(arr);//[7,10]
Afaik,JS对象中属性的顺序并不总是有保证的。因此,在您的示例([7,10])中,您无法100%确定哪一项是第1项的总和,哪一项是第40项的总和。你可以在求和时使用地图或保留道具。请看Afaik,JS对象中属性的顺序并不总是得到保证。因此,在您的示例([7,10])中,您无法100%确定哪一项是第1项的总和,哪一项是第40项的总和。你可以在求和时使用地图或保留道具。查看其中一个值是否为空。让arr=[{item1:'3',item40:'2'},{item1:'4',item40:'''''}][7,2]只需添加边缘大小写处理谢谢。非常聪明,但是为什么要使用
parseInt
?如果其中一个值为空怎么办。让arr=[{item1:'3',item40:'2'},{item1:'4',item40:'''''}][7,2]只需添加边缘大小写处理谢谢。非常聪明,但为什么要使用
parseInt