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

У меня есть вложенный массив объектов, и я хочу сгруппировать идентификатор и сформировать новый массив. Вот мой массив:

mainArray = [
  { name: 'a',age: 10, company: [ { desc: 'test1' , id: 6 }, { desc: 'testa' , id: 10 }] },
  { name: 'b',age: 20, company: [ { desc: 'test2' , id: 30 }] },
  { name: 'c',age: 40, company: [ { desc: 'test3' , id: 10 }, { desc: 'testc' , id: 30 }] }
]

Я могу сгладить весь массив, но это не похоже на правильный способ сделать это.

Мой новый массив должен выглядеть примерно так:

result = [
  comapny_6: [
    {
      name: 'a',
      age: 10,
      desc: 'test1'
    },
  ],
  comapny_10: [
    {
      name: 'a',
      age: 10,
      desc: 'testa'
    },
    {
      name: 'c',
      age: 40,
      desc: 'test3'
    }
  ],

  company_30 :[
    {
      name: 'b',
      age: 20,
      desc: 'test2'
    },
    {
      name: 'c',
      age: 40,
      desc: 'testc'
    }
  ]
]

Я открыт для предложений о том, как должна выглядеть окончательная структура данных. Суть в том, что я хочу идентификатор groupBy, чтобы у меня была информация о каждой компании отдельно.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Вы можете сначала создать одномерный массив, используя flatMap(), а затем использовать reduce() для группировки

const mainArray = [
  { name: 'a',age: 10, company: [ { desc: 'test1' , id: 6 }, { desc: 'testa' , id: 10 }] },
  { name: 'b',age: 20, company: [ { desc: 'test2' , id: 30 }] },
  { name: 'c',age: 40, company: [ { desc: 'test3' , id: 10 }, { desc: 'testc' , id: 30 }] }
]

const flat = mainArray.flatMap(({company,...rest}) => company.map(a => ({...rest,...a})));

const res = flat.reduce((ac,{id,...rest}) => ((ac[`company_${id}`] || (ac[`company_${id}`] = [])).push(rest),ac),{})
console.log(res)

Объяснение

reduce() - это метод, который возвращает одно значение после итерации по всему массиву.Аккумулятор, то есть ac в вышеприведенном случае, устанавливается на пустой объект {} (который является вторым аргументом, передаваемым функции)

В каждой итерации мы возвращаем обновленный аккумулятор, который становится ac для следующей итерации.Поэтому мы возвращаем из функции следующее выражение

((ac[`company_${id}`] || (ac[`company_${id}`] = [])).push(rest),ac)

ac[ company _ $ {id} ] использует обозначение в скобках, которое принимает выражение company_${id}.Это то же самое, что и

ac["company_" + id]

В приведенной выше строке проверяется, существует ли ac[company_${id}] в ac, а затем push() rest в нем.

Если ac[company_${id}] нетсозданные, но они устанавливают его в пустой массив [], затем push() rest к нему.

В последней части используется оператор запятой

((ac[`company_${id}`] || (ac[`company_${id}`] = [])).push(rest),ac)

Приведенное выше целое выражение оценивается какпоследнее значение, разделенное запятой ,, равное ac.Таким образом, в каждой итерации мы помещаем rest в соответствующий массив и возвращаем ac в конце.Код эквивалентен

const res = flat.reduce((ac,{id,...rest}) => {
    //check if company id doesnot exist as key in ac then set it empty array
    if(!ac[`company_${id}`]) ac[`company_${id}`] = [];
    //push rest(which will be an object with all the keys expect id)
    ac[`company_${id}`].push(rest)
    //at last return ac
    return ac;
})
1 голос
/ 17 мая 2019

Вы можете использовать reduce для циклического перемещения по массиву и создания желаемого объекта вывода. Используйте forEach для цикла company

var mainArray = [{"name":"a","age":10,"company":[{"desc":"test1","id":6},{"desc":"testa","id":10}]},{"name":"b","age":20,"company":[{"desc":"test2","id":30}]},{"name":"c","age":40,"company":[{"desc":"test3","id":10},{"desc":"testc","id":30}]}];

var result = mainArray.reduce((c, {name,age,company}) => {
  company.forEach(({id,desc}) => (c["company_" + id] = c["company_" + id] || []).push({name,age,desc}));
  return c;
}, {});

console.log(result);
0 голосов
/ 17 мая 2019

Вы можете достичь этого с помощью Array.reduce и внутри него с помощью Array.forEach для множества компаний, подобных этой:

let data = [ { name: 'a',age: 10, company: [ { desc: 'test1' , id: 6 }, { desc: 'testa' , id: 10 }] }, { name: 'b',age: 20, company: [ { desc: 'test2' , id: 30 }] }, { name: 'c',age: 40, company: [ { desc: 'test3' , id: 10 }, { desc: 'testc' , id: 30 }] } ] 

let result = data.reduce((r,{ name, age, company }) => {
  company.forEach(({ id, desc }) => 
   r[`company_${id}`] = (r[`company_${id}`] || []).concat({ name, age, desc }))
  return r
}, {})

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...