Объединить объекты подкатегории массива на основе его категории - PullRequest
0 голосов
/ 01 февраля 2019

Q: Вот массив из нескольких объектов (категорий и подкатегорий).

let cats = [
  { cat: 'letter', subCat: 'A'}, 
  { cat: 'letter', subCat: 'B'}, 
  { cat: 'number', subCat: '2'}, 
  { cat: 'number', subCat: '3'}, 
  { cat: 'number', subCat: '4'}, 
  { cat: 'other', subCat: '+'}, 
]

необходимо преобразовать этот объект кошек следующим образом -

cats = [
    { cat: 'letter', subCat: ['A', 'B'] },
    { cat: 'number', subCat: ['2', '3', '4'] },
    { cat: 'other', subCat: ['+'] }
  ]

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете достичь этого, используя простой reduce

let cats=[{cat:'letter',subCat:'A'},{cat:'letter',subCat:'B'},{cat:'number',subCat:'2'},{cat:'number',subCat:'3'},{cat:'number',subCat:'4'},{cat:'other',subCat:'+'},]

const merged = cats.reduce((a, {cat, subCat})=>{
  a[cat] = a[cat] || {cat, subCat:[]}
  a[cat]["subCat"].push(subCat)
  return a;
},{})

console.log(Object.values(merged))

Создайте аккумулятор с каждым уникальным cat как key и нужным вам объектом в конечном массиве как value, например:

{
  "letter": {
    "cat": "letter",
    "subCat": [
      "A",
      "B"
    ]
  }
}

Затем используйте Object.values, чтобы получить только значения в массиве.

Вы можете сделать все это за один раз:

let cats = [{cat:'letter',subCat:'A'},{cat:'letter',subCat:'B'},{cat:'number',subCat:'2'},{cat:'number',subCat:'3'},{cat:'number',subCat:'4'},{cat:'other',subCat:'+'},]

const merged = Object.values(cats.reduce((a,{cat, subCat}) => (
  (a[cat] = a[cat] || {cat, subCat:[]})["subCat"].push(subCat), a
),{}))

console.log(merged)
...