过滤重复对象的数组并获取它们的总和

问题描述 投票:0回答:4

所以我有下一个信息,我想要实现的是过滤对象数组并对重复对象的数量求和

//Original Data
var data = {
    sublists = [
    { item: 1, qty: 2},
    { item: 2, qty: 2},
    { item: 3, qty: 2},
    { item: 1, qty: 5}
    { item: 3, qty: 3}
    ],
    ...
};
//This is what I want to achieve
var result = {
    sublists = [
    { item: 1, qty: 7},
    { item: 2, qty: 2},
    { item: 3, qty: 5}

    ],
    ...
};

到目前为止,我得到的是重复的项目名称和具有该变量数据的对象

var repeatedObjects = {
  1: [{ item: 1, qty: 2}, { item: 1, qty: 5}],
  3: [{ item: 3, qty: 2}, { item: 3, qty: 3}]
}
var repeatedItems = [1, 3];

但是我坚持减少对象,这样我就可以获得原始数据,其中只有一个重复对象以及所有对象的总和。有什么想法吗?

javascript arrays sorting
4个回答
0
投票

创建一个 itemByFreq json 对象,如下所示

var data = {
    sublists : [
    { item: 1, qty: 2},
    { item: 2, qty: 2},
    { item: 3, qty: 2},
    { item: 1, qty: 5},
    { item: 3, qty: 3}
    ]
};

var itemByFreq = {};
for(var i=0;i<data.sublists.length;i++){
var ji = data.sublists[i];
itemByFreq[ji.item] = (itemByFreq[ji.item] || 0) + ji.qty;
}

console.log(itemByFreq);

var duplicateItems = [];
for(var key in itemByFreq)
	duplicateItems.push({item: key,qty: itemByFreq[key]});

console.log(duplicateItems);


0
投票

如果您喜欢使用

lodash
在一行中完成此操作,您也可以使用这个

const _ = require("lodash");

const data = [
  {"item": 1, "qty": 2},
  {"item": 2, "qty": 2},
  {"item": 3, "qty": 2},
  {"item": 1, "qty": 5},
  {"item": 3, "qty": 3}
];

const result = _.map(_.groupBy(data, i => i.item), (o, idx) => {
  return {"item": idx, "qty": _.sumBy(o, i => i.qty)};
});

console.log(result);


0
投票

可以使用

Map
reduce

来完成

const dataSample = {
    sublists: [
      { item: 1, qty: 2},
      { item: 2, qty: 2},
      { item: 3, qty: 2},
      { item: 1, qty: 5},
      { item: 3, qty: 3}
    ],
};

const mergeItems = list => {
  return [...list.reduce((acc, val) => {
    const oldVal = acc.get(val.item) || { qty: 0 }
    const newVal = {
      ...val,
      qty: oldVal.qty + val.qty
    }
    acc.set(val.item, newVal)
    return acc
  }, new Map()).values()]
}

console.log(mergeItems(dataSample.sublists))


-1
投票

使用

reduce
会简化

const update = data =>
  Object.values(
    data.sublists.reduce((acc, curr) => {
      acc[curr.item] =
        curr.item in acc
          ? { ...acc[curr.item], qty: acc[curr.item].qty + curr.qty }
          : { ...curr };
      return acc;
    }, {})
  );

var data = {
  sublists: [
    { item: 1, qty: 2 },
    { item: 2, qty: 2 },
    { item: 3, qty: 2 },
    { item: 1, qty: 5 },
    { item: 3, qty: 3 }
  ]
};

const res = { sublists: update(data) };

console.log(res);

© www.soinside.com 2019 - 2024. All rights reserved.