Вы можете создать функцию с _.flow()
, которая использует _.groupBy()
для сбора элементов с одинаковыми year
в массивы, а затем сопоставляет и объединяет массивы:
const { flow, groupBy, map, merge } = _;;
const fn = flow(
arr => groupBy(arr, 'year'),
groups => map(groups, g => merge({}, ...g))
);
const scores = [{"year":2020,"dave":20},{"year":2020,"steve":17},{"year":2019,"bill":18}];
const result = fn(scores);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
Использование lodash / fp делает это решение еще более кратким:
const fn = flow(
groupBy('year'),
map(mergeAll)
);
const scores = [{"year":2020,"dave":20},{"year":2020,"steve":17},{"year":2019,"bill":18}];
const result = fn(scores);
console.log(result);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
Однако, поскольку _.mergeBy()
создает объект, группировка по номеру изменит порядок групп (2020 г. после 2019 г.). Вы можете уменьшить массив до Map, чтобы сохранить порядок, а затем преобразовать его в массив, расширив итератор значений Map:
const scores = [{"year":2020,"dave":20},{"year":2020,"steve":17},{"year":2019,"bill":18}];
const result = [...scores.reduce((r, o) =>
r.set(o.year, { ...r.get(o.year), ...o })
, new Map()).values()];
console.log(result);