Отфильтруйте массив повторяющихся объектов и получите их сумму - PullRequest
2 голосов
/ 16 февраля 2020

Итак, у меня есть следующая информация, которую я хочу достичь, это отфильтровать массив объектов и суммировать количество повторяющихся объектов. объект, который имеет данные этих переменных

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

Но я застрял в сокращении объекта, чтобы я мог получить исходные данные, используя только один из повторяющихся объектов и сумму всех из них. Есть идеи?

Ответы [ 4 ]

0 голосов
/ 16 февраля 2020

Если вы хотите использовать 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 голосов
/ 16 февраля 2020

Это можно сделать, используя 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))
0 голосов
/ 16 февраля 2020

Использование 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);
0 голосов
/ 16 февраля 2020

Создать объект 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...