将多个对象合二为一,将值一起添加

时间:2018-02-28 00:10:13

标签: javascript arrays object

我们说我有一系列对象:

[
    {
        category: 'Category A',
        mainUnits: 5,
        subUnits: 3
    },

    {
        category: 'Category A',
        mainUnits: 9,
        subUnits, 12
    },

    {
        category: 'Category B',
        mainUnits: 4,
        subUnits, 6
    },

    {
        category: 'Category B',
        mainUnits: 2,
        subUnits, 4
    }
]

但是,我似乎无法得到一个如下所示的数组:

[
    {
        category: 'Category A',
        mainUnits: 14,
        subUnits: 15
    },

    {
        category: 'Category B',
        mainUnits: 6,
        subUnits: 10
    }
]

我已经取得了一些进展,但不能得到我需要的确切结果。非常感谢任何指导,谢谢!

3 个答案:

答案 0 :(得分:7)

.reduce数组方法似乎非常合适。

使用数组.find方法查看结果中是否已存在具有该类别的项目。如果是,请添加字段,但如果不是,请将项目添加到结果中:

const input = [{
  category: 'Category A',
  mainUnits: 5,
  subUnits: 3
}, {
  category: 'Category A',
  mainUnits: 9,
  subUnits: 12,
}, {
  category: 'Category B',
  mainUnits: 4,
  subUnits: 6,
}, {
  category: 'Category B',
  mainUnits: 2,
  subUnits: 4,
}];

const result = input.reduce((result, item) => {
  const existing = result.find(x => x.category === item.category);
  if (existing) {
    existing.mainUnits += item.mainUnits;
    existing.subUnits += item.subUnits;
  } else {
    result.push(item);
  }

  return result;
}, []);

console.log(result);

答案 1 :(得分:5)

@ CRice的答案很棒,但如果你愿意,这是另一种方法:

const input = [{
  category: 'Category A',
  mainUnits: 5,
  subUnits: 3
}, {
  category: 'Category A',
  mainUnits: 9,
  subUnits: 12
}, {
  category: 'Category B',
  mainUnits: 4,
  subUnits: 6
}, {
  category: 'Category B',
  mainUnits: 2,
  subUnits: 4
}];

let sums = {};
for (let entry of input) {
  sums[entry.category] = sums[entry.category] || {
    mainUnits: 0,
    subUnits: 0
  };
  sums[entry.category].mainUnits += entry.mainUnits;
  sums[entry.category].subUnits += entry.subUnits;
}

const result = Object.keys(sums).map(category => Object.assign({
  category
}, sums[category]));

console.log(result);

答案 2 :(得分:1)

你需要这样的功能:



function catTotals(catsArray){
  var cats = [], totals = [];
  for(var i=0,ca,c,o,x,l=catsArray.length; i<l; i++){
    ca = catsArray[i]; c = ca.category; x = cats.indexOf(c);
    if(x === -1){
      cats.push(c); totals.push({category:c, mainUnits:ca.mainUnits, subUnits:ca.subUnits});
    }
    else{
      o = totals[x]; o.mainUnits += ca.mainUnits; o.subUnits += ca.subUnits;
    }
  }
  return totals;
}
var cats = [
    {
        category: 'Category A',
        mainUnits: 5,
        subUnits: 3
    },

    {
        category: 'Category A',
        mainUnits: 9,
        subUnits: 12
    },

    {
        category: 'Category B',
        mainUnits: 4,
        subUnits: 6
    },

    {
        category: 'Category B',
        mainUnits: 2,
        subUnits: 4
    }
]
console.log(catTotals(cats));
&#13;
&#13;
&#13;

相关问题