在javascript中,需要执行动态数组的求和
我有一个动态数组,我需要对它进行求和在javascript中,需要执行动态数组的求和,javascript,angular,Javascript,Angular,我有一个动态数组,我需要对它进行求和 {ClientName: "A", Alex: 2, Da: 0, Cal: 0} {ClientName: "b", Alex: 0, Da: 0, Cal: 4} {ClientName: "c", Alex: 1, Da: 0, Cal: 5} {ClientName: "d", Alex: 2, Da: 0, Cal: 0} 在这个数组中,客户端名称是固定的,但其他列(如Alex、Da、Cal)是动态的,并且会有所不同。我需要在typescrip
{ClientName: "A", Alex: 2, Da: 0, Cal: 0}
{ClientName: "b", Alex: 0, Da: 0, Cal: 4}
{ClientName: "c", Alex: 1, Da: 0, Cal: 5}
{ClientName: "d", Alex: 2, Da: 0, Cal: 0}
在这个数组中,客户端名称是固定的,但其他列(如Alex、Da、Cal)是动态的,并且会有所不同。我需要在typescript中创建一个通用函数,输出如下
{ClientName: "Total", Alex: 5, Da: 0, Cal: 9}
您可以尝试以下方法: 想法:
- 使用
获取所有可枚举键Object.keys
- 在其上循环,如果未找到,则将其设置为默认值。然后添加当前对象的值
- 由于
需要硬编码值,所以可以在循环中设置它,也可以在循环后设置它ClientName
const数据=[
{客户名称:“A”,Alex:2,Da:0,Cal:0},
{客户名称:“b”,Alex:0,Da:0,Cal:4},
{客户名称:“c”,Alex:1,Da:0,Cal:5},
{客户名称:“d”,Alex:2,Da:0,Cal:0},
]
常量输出=数据减少((acc,项目)=>{
对象
.钥匙(项目)
.forEach((键)=>{
acc[键]=(acc[键]| | 0)+项[键]
});
acc.ClientName='Total'
返回acc;
}, {})
log(output)
只要ClientName之外的所有键都定义为数字,这些行中的某些内容就应该可以工作
arr.reduce((sumObject, item) => {
Object.keys(item).forEach(key => {
if(key === 'ClientName'){
return false
}
if(!sumObject[key]) {
sumObject[key] = item[key]
} else {
sumObject[key] += item[key]
}
})
return sumObject
}, {ClientName: 'Total'})
选中此选项可以简单地得到答案您可以减少所需的值
var data=[{ClientName:“A”,Alex:2,Da:0,Cal:0},{ClientName:“b”,Alex:0,Da:0,Cal:4},{ClientName:“c”,Alex:1,Da:0,Cal:5},{ClientName:“d”,Alex:2,Da:0,Cal:0}],
total=data.reduce((a,{ClientName,…b})=>Object.assign(
{},
A.
{ClientName:'总计'},
…Object.entries(b.map)([k,v])=>({[k]:(a[k]| | 0)+v}))
));
控制台日志(总计)
您可以使用reduce
进行迭代,以生成单个输出并合并键计数,您可以使用对象。键
和映射
将允许您在对象键上进行迭代。还添加了一个动态键以验证结果
const对象=[{
客户名称:“A”,
亚历克斯:2,
Da:0,
加州:0
},
{
客户名称:“b”,
亚历克斯:0,
Da:0,
卡尔:4
},
{
客户名称:“c”,
亚历克斯:1,
Da:0,
卡尔:5
},
{
客户名称:“d”,
亚历克斯:2,
Da:0,
卡尔:0,
Abc:9
},
]
const result=object.reduce((累加器,当前值)=>{
Object.keys(currentValue).map((indexKey)=>{
累加器[索引键]=(累加器[索引键]| | 0)+当前值[索引键]
});
accumulator.ClientName=“总计”;
回流蓄能器;
})
控制台日志(结果)代码>请添加尝试。“列是动态的”表示属性名称是任意的,可以是任何内容?或者有一组可能的列名吗?OP正在寻找一种处理动态列的解决方案。如果您是对的,它不应该适用于动态列。谢谢您,您的解决方案与我的完全相同。发帖前请检查其他答案是的,我同意,但看起来很相似,但不完全一样,请看您的代码中有forEach
,它比我的解决方案中使用的.map
优化程度更低。不管怎样,我已经投票赞成你的解决方案。使用没有返回语句的映射更糟糕。此外,我不认为map比forEach更优化,但可以稍后再讨论
let arr = [
{ClientName: "A", Alex: 2, Da: 0, Cal: 0},
{ClientName: "b", Alex: 0, Da: 0, Cal: 4},
{ClientName: "c", Alex: 1, Da: 0, Cal: 5},
{ClientName: "d", Alex: 2, Da: 0, Cal: 0}
];
let output = arr.reduce((curr, next) => {
return {ClientName: "Total", Alex: (curr.Alex + next.Alex ), Da: (curr.Da + next.Da), Cal: (curr.Cal + next.Cal)};
});
console.log(output);