在具有相同ID的数组中添加/求和多个值

时间:2019-03-25 03:27:51

标签: javascript arrays google-sheets

所以可以说我有以下数组。

     [{idProduct:1, unitCost:400},
     {idProduct:1, unitCost:160},
     {idProduct:1, unitCost:46}, 
     {idProduct:2, unitCost:200},
     {idProduct:2, unitCost:40}

我似乎无法找到添加产品1单位成本,然后切断以添加产品2的其他单位成本的方法,依此类推...我实际上想将其附加到Google电子表格的另一行中但是我首先要计算它。

我尝试了一些for / if循环,但最终总会得出所有产品的总成本,而不仅仅是单个产品。

此用于给出所有ID的总费用。当我在其中放置if时,我不确定如何比较两个id,如果我想重设总和,我应该将totalCost设置回0

  for (var a = 0; a < arr.length ; a++) {
    totalCost= totalCost+ arr[a].unitCost;
  }

我尝试了一个if休息,但似乎也没有用,想尝试诺言,但我不确定那会有所帮助。我还尝试设置另一个,以便将下一个ID与当前所在的IM进行比较,但这似乎使事情变得复杂,而且我得到的数字是错误的。

我也尝试过

  for (var a = 0; a < arr.length ; a++) {
    if(arr[a].idProduct === arr[a+1].idProduct){
    totalCost= totalCost+ arr[a].unitCost;
    }
  }

但是,当然,在最后一个id上,由于a + 1的长度大于数组的长度,因此它会将其与未定义的内容进行比较。

我现在真的为此感到筋疲力尽,并且非常确定这是一个简单的解决方案,但是我真的不知道该怎么办

3 个答案:

答案 0 :(得分:2)

您可以使用reduce来总结数组,并使用idProduct作为键将值添加到对象中。使用Object.values将对象转换为数组。

let arr = [{"idProduct":1,"unitCost":400},{"idProduct":1,"unitCost":160},{"idProduct":1,"unitCost":46},{"idProduct":2,"unitCost":200},{"idProduct":2,"unitCost":40}]

let result = Object.values(arr.reduce((c, {idProduct,unitCost}) => {
  c[idProduct] = c[idProduct] || {idProduct,unitCost: 0};
  c[idProduct].unitCost += unitCost;
  return c;
}, {}));

console.log( result );


或者您可以将idProduct用作键,将sum和用作值,例如:

let arr = [{"idProduct":1,"unitCost":400},{"idProduct":1,"unitCost":160},{"idProduct":1,"unitCost":46},{"idProduct":2,"unitCost":200},{"idProduct":2,"unitCost":40}]

let result = arr.reduce((c, {idProduct,unitCost}) => {
  c[idProduct] = c[idProduct] || 0;
  c[idProduct] += unitCost;
  return c;
}, {});

console.log(result);

答案 1 :(得分:0)

您可以像下面那样使用.forEach()。此代码将e.unitCost添加到具有相同idProduct

的对象中

var input = [{
    idProduct: 1,
    unitCost: 400
  },
  {
    idProduct: 1,
    unitCost: 160
  },
  {
    idProduct: 1,
    unitCost: 46
  },
  {
    idProduct: 2,
    unitCost: 200
  },
  {
    idProduct: 2,
    unitCost: 40
  }
];
var output = { };

input.forEach(e => output[e.idProduct] = (output[e.idProduct] || 0) + e.unitCost);

console.log(output);

答案 2 :(得分:0)

let pro;
let unitcost=[];
for (var a = 0; a < arr.length ; a++) {
    if(pro==arr[a].idProduct){
        unitcost[unitcost.length-1]+=arr[a].unitCost;
    }
    else{
        pro=arr[a].idProduct;
        unitcost.push(pro);
        unitcost.push(arr[a].unitCost);

    }   
}
console.log(unitcost);