如果多个键是相同的JS,则在对象中求和值

时间:2016-10-04 15:58:33

标签: javascript arrays

例如,我有5个对象:

{ row: aa, col: 1, value: 1 }
{ row: bb, col: 2, value: 1 }
{ row: bb, col: 3, value: 1 }
{ row: aa, col: 1, value: 1 }
{ row: aa, col: 2, value: 1 }

我想在 col 相同的情况下对值进行求和,因此输出应为:

{ row: aa, col: 1, value: 2 }
{ row: bb, col: 2, value: 1 }
{ row: bb, col: 3, value: 1 }
{ row: aa, col: 2, value: 1 }

谢谢你的帮助!

试过这个: Sum javascript object propertyA values with same object propertyB in array of objects

3 个答案:

答案 0 :(得分:4)

您可以使用reduce()和一个对象来存储密钥。

var data = [
  { row: 'aa', col: 1, value: 1 },
  { row: 'bb', col: 2, value: 1 },
  { row: 'bb', col: 3, value: 1 },
  { row: 'aa', col: 1, value: 1 },
  { row: 'aa', col: 2, value: 1 }
]

var o = {}
var result = data.reduce(function(r, e) {
  var key = e.row + '|' + e.col;
  if (!o[key]) {
    o[key] = e;
    r.push(o[key]);
  } else {
    o[key].value += e.value;
  }
  return r;
}, []);

console.log(result)

答案 1 :(得分:2)

为了完整起见,使用可变键的版本,一个用于对部件进行分组的对象Array#forEach



var data = [{ row: 'aa', col: 1, value: 1 }, { row: 'bb', col: 2, value: 1 }, { row: 'bb', col: 3, value: 1 }, { row: 'aa', col: 1, value: 1 }, { row: 'aa', col: 2, value: 1 }],
    grouped = [];

data.forEach(function (a) {
    var key = ['row', 'col'].map(function (k) { return a[k]; }).join('|');
    if (!this[key]) {
        this[key] = { row: a.row, col: a.col, value: 0 };
        grouped.push(this[key]);
    }
    this[key].value += a.value;
}, Object.create(null));

console.log(grouped);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 2 :(得分:1)

我要做的是将你的对象放在一个数组中然后迭代它并检查每次迭代是否新对象的键与旧对象的键匹配,如果没有'那么将对象加载到一个单独的数组中。 ta匹配。如果匹配,则将其值添加到旧自己的值。我测试了下面的代码,它似乎按你想要的方式工作。

 var array = [{ row: 'aa', col: 1, value: 1 },
         { row: 'bb', col: 2, value: 1 },
         { row: 'bb', col: 3, value: 1 },
         { row: 'aa', col: 1, value: 1 },
         { row: 'aa', col: 2, value: 1 }];

 var newArray = [];

 for(var x in array) {
    for(var y in newArray) {
        var found = false;
        if(array[x].row == newArray[y].row && array[x].col == newArray[y].col) {
             newArray[y].value += array[x].value;
             found = true;
             break;
        }
    }
    if(!found) {
          newArray.push(array[x]);
    }
 }

 console.log(newArray);