Сгруппировать элементы массива

196
21 января 2020, 11:10

Имеется массив объектов

[
  {type: 'credit', currentDept: 23}
  {type: 'credit', currentDept: 21}
  {type: 'credit', currentDept: 40}
  {type: 'hsc', currentDept: 83}
  {type: 'alimony', currentDept: 10}
  {type: 'alimony', currentDept: 51}
]

Как можно сделать из этих исходных данных массив объектов такого вида?

[
  {type: 'credit', currentDept: 84}
  {type: 'hsc', currentDept: 83}
  {type: 'alimony', currentDept: 61}
]
Answer 1

Функциональным подходом, и без побочных эффектов (типа изменения элементов исходного массива):

const arr = [ 
  {type: 'credit', currentDept: 23},  
  {type: 'credit', currentDept: 21},  
  {type: 'credit', currentDept: 40},  
  {type: 'hsc', currentDept: 83},  
  {type: 'alimony', currentDept: 10},  
  {type: 'alimony', currentDept: 51},  
];  
 
let grouped = Object.entries( 
  arr.reduce((r, { type, currentDept:cd }) => ((r[type] = (r[type] || 0) + cd), r), {}) 
).map(([ type, currentDept ]) => ({ type, currentDept }));  
 
console.log(grouped); 

ES8+

Answer 2

var input = [ 
  {type: 'credit', currentDept: 23}, 
  {type: 'credit', currentDept: 21}, 
  {type: 'credit', currentDept: 40}, 
  {type: 'hsc', currentDept: 83}, 
  {type: 'alimony', currentDept: 10}, 
  {type: 'alimony', currentDept: 51} 
]; 
 
function group(arr) { 
  var r1 = arr.reduce((r, el) => { 
    if (typeof r[el.type] == "undefined") { 
      r[el.type] = 0; 
    } 
    r[el.type] += el.currentDept; 
    return r; 
  }, {}); 
  var r2 = []; 
  for (var key in r1) 
    r2.push({ type: key, currentDept: r1[key] }); 
  return r2; 
} 
 
console.log(group(input));

Answer 3

Вот так можно:

let d = [ 
  {type: 'credit', currentDept: 23}, 
  {type: 'credit', currentDept: 21}, 
  {type: 'credit', currentDept: 40}, 
  {type: 'hsc', currentDept: 83}, 
  {type: 'alimony', currentDept: 10}, 
  {type: 'alimony', currentDept: 51} 
]; 
 
function collapse(d) { 
  d = d.reduce((a, e) => (a[e.type] = (a[e.type]||0) + e.currentDept, a), {}); 
  return Object.keys(d).map(key => ({type: key, currentDept: d[key]})) 
} 
 
console.log(collapse(d))

READ ALSO
Создать конструктор объектов

Создать конструктор объектов

Снова прошу помощи у сообщества/*2

150
Telegram бот Последовательный ввод данных NodeJS telegraph

Telegram бот Последовательный ввод данных NodeJS telegraph

Пишу бота на NodeJS, используя telegraph и вот уже в который раз сталкиваюсь с одной и той же проблемойКак ввести последовательно данные и сделать...

291
Анимация картинки на Javascript

Анимация картинки на Javascript

Хочу реализовать анимацию картинки, как вот на этом сайте https://bmfestcom, принцип работы должен быть таким, чтобы при ведении курсора мыши, картинка...

137
Почему аудио-скрипт не работает в Google Chrome?

Почему аудио-скрипт не работает в Google Chrome?

Нашёл вот такой скрипт, который проигрывает звук на странице

202