Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中,需要执行动态数组的求和_Javascript_Angular - Fatal编程技术网

在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);