Javascript создать новый массив из данного массива - PullRequest
0 голосов
/ 22 мая 2018

У меня есть массив объектов, содержащих числа и суммы

[
   {num: 1, sum: 10},
   {num: 1, sum: 2},
   {num: 1, sum: 3},
   {num: 2, sum: 1},
   {num: 2, sum: 40},
   {num: 2, sum: 100},
   {num: 3, sum: 0},
   {num: 4, sum: 0},
]

Как я хочу это:

[
   {1: {count: 3, totalSum: 15},
   {2: {count: 3, totalSum: 141},
   {3: {count: 1, totalSum: 0},
   {4: {count: 1, totalSum: 0},
]

Любая помощь высоко ценится

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете использовать метод reduce для группировки массива, а затем использовать другой метод reduce, чтобы найти свойства count и totalSum для каждого ключа.

let arr = [ {num: 1, sum: 10}, {num: 1, sum: 2}, {num: 1, sum: 3}, {num: 2, sum: 1}, {num: 2, sum: 40}, {num: 2, sum: 100}, {num: 3, sum: 0}, {num: 4, sum: 0}, ]

var groupBy = function(arr, key) {
  return arr.reduce(function(acc, x) {
    (acc[x[key]] = acc[x[key]] || []).push(x);
    return acc;
  }, {});
};

let grouped = groupBy(arr, 'num');

let result = Object.keys(grouped).reduce(function(acc, key){
  let obj ={ [key] :  {count : grouped[key].length, totalSum: grouped[key].map(a => a.sum).reduce((a,b) => a + b)}}
  acc.push(obj)
  return acc;
},[]);
console.log(result);
0 голосов
/ 22 мая 2018

Можно указать reduce в объект, индексированный с помощью num s, а затем map этот объект в массив:

const input=[{num:1,sum:10},{num:1,sum:2},{num:1,sum:3},{num:2,sum:1},{num:2,sum:40},{num:2,sum:100},{num:3,sum:0},{num:4,sum:0},]
const outputObj = input.reduce((a, { num, sum }) => {
  if (!a[num]) a[num] = { count: 0, totalSum: 0 };
  a[num].count++;
  a[num].totalSum += sum;
  return a;
}, {});
const output = Object.entries(outputObj)
  .map(([key, val]) => ({ [key] : val }));
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...