Как сгруппировать массив объектов по ключу? - PullRequest
0 голосов
/ 14 января 2019

Кто-нибудь знает (простой js, если возможно, тоже) способ сгруппировать массив объектов по ключу объекта, а затем создать новый массив объектов на основе группировки? Например, у меня есть массив автомобильных объектов:

const array = [
  {red: [ {height: 50} ]},
  {green: [ {height: 20} ]},
  {blue: [ {height: 30} ]},
  {blue: [ {height: 40} ]},
  {red: [ {height: 10} ]},
  {green: [ {height: 60} ]}
]

Я хочу создать новый массив объектов, сгруппированных по цвету.

const result = [
  {red: [{height: 50}, {height: 10}]},
  {green: [{height: 20}, {height: 60}]},
  {blue: [{height: 30}, {height: 40}]}
]

Я пытался использовать lodash.groupBy, однако вообще не знаю, как решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете использовать lodash _.mergeWith() для объединения объектов с одним и тем же ключом, а затем использовать _.map() для преобразования его обратно в массив:

const array = [{"red":[{"height":50}]},{"green":[{"height":20}]},{"blue":[{"height":30}]},{"blue":[{"height":40}]},{"red":[{"height":10}]},{"green":[{"height":60}]}]

const fn = _.flow([
  arr => _.mergeWith({}, ...arr, (o, s) => _.isArray(o) ? o.concat(s) : s),
  objs => _.map(objs, (v, k) => ({ [k]: v }))
])

const result = fn(array)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 14 января 2019

Используя массив Reduce, вы можете перебирать данные и вычислять объект результата.

const array = [
  { 'red': [ { height: 50 } ] },
  { 'green': [ { height: 20 } ] },
  { 'blue': [ { height: 30 } ] },
  { 'blue': [ { height: 40 } ] },
  { 'red': [ { height: 10 } ] },
  { 'green': [ { height: 60 } ] }
];

const res = array.reduce((acc, element) => {
  // Extract key and height value array
  const [key, heightValue] = Object.entries(element)[0];
  // Get or create if non-exist, and push height value from array, index 0
  (acc[key] || (acc[key] = [])).push(heightValue[0]);
  return acc;
}, {});

console.log(res);
...