LINUX.ORG.RU

Собрать значения в кучу с помощью reduce

 , ,


0

1

Есть список значений параметров по годам, типа

2000 x 13
2000 y 74
2001 x 55
2001 y 83
...
2018 z 7


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

var _ = require('underscore');
var data = [{
  year: 2000,
  name: 'x',
  value: 13
}, {
  year: 2000,
  name: 'y',
  value: 74
}, {
  year: 2001,
  name: 'x',
  value: 55
}, {
  year: 2001,
  name: 'y',
  value: 83
}, {
  year: 2018,
  name: 'z',
  value: 7
}];
console.log(_.values(_.reduce(data,
  function(memo, v) {
    if (!memo[v.year])
      memo[v.year] = {
        year: v.year
      };
    memo[v.year][v.name] = v.value;
    return memo;
  }, {}
)));


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

Меня больше интересует, зачем для такой тривиальщины ты тянешь лодэш, когда все это реализуется ванильными апи.

data.reduce((acc, {year, name, value}) => (year in acc || (acc[year] = {}), acc[year][name] = value, acc), {})

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

Каждый раз возвращали бы новый аккумулятор.

anonymous ()
Ответ на: комментарий от onetoomany

Только новыми.

Ложь. Он поддерживается даже устаревшими уже браузерами. ES5 это стандарт 2011 года. Ты пишешь под ES3? Ты сумашедший.

anonymous ()

Напиши себе такую функцию:

const reduceBy = (reducer, initial, key) => (data) => {
  const accums = {};
  for (const datum of data) {
    const k = key(datum);
    accums[k] = reducer(accums[k] || initial, datum);
  }
  return accums;
};
Или можешь подключить https://ramdajs.com, там она из коробки

deadNightTiger ★★★★★ ()
Последнее исправление: deadNightTiger (всего исправлений: 2)
Ответ на: комментарий от onetoomany

_.values есть в ES8, можно поставить полифилл, _.pluck тривиально заменяется на map.

static_lab ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.