@narem

Как структурировать массив объектов через reduce?

Помогите разобраться с reduce.
Есть массив объектов
[
  {
    "name":"Фамилия Имя Отчество 1",
    "rank":"Техник",
    "phone":"11111",
    "mainPhone":"88009006565",
    "description":"короткое описание",
    "category":{
      "name":"Категоря 1",
      "address":"Тут адрес 1",
      "position":100
    },
    "subCategory":{
      "name":"Подкатегория 1",
      "position":100
    }
  },
  {
    "name":"Фамилия Имя Отчество 2",
    "rank":"Начальник",
    "phone":"22222",
    "mainPhone":"88009006564",
    "description":"короткое описание",
    "category":{
      "name":"Категоря 1",
      "address":"Тут адрес 1",
      "position":100
    },
    "subCategory":{
      "name":"Подкатегория 2",
      "position":200
    }
  },
  {
    "name":"Фамилия Имя Отчество 3",
    "rank":"Техник",
    "phone":"22222",
    "mainPhone":"88009006564",
    "description":null,
    "category":{
      "name":"Категоря 1",
      "address":"Тут адрес 1",
      "position":100
      },
    "subCategory":{
      "name":"Подкатегория 1",
      "position":100
    }
  },
  {
    "name":"Фамилия Имя Отчество 3",
    "rank":"Техник",
    "phone":"22222",
    "mainPhone":"88009006564",
    "description":null,
    "category":{
      "name":"Категоря 2",
      "address":"Тут адрес 1",
      "position":100
      },
    "subCategory":{
      "name":"Подкатегория 1",
      "position":100
    }
  }
]


мне надо его структурировать примерно так
[
{
 name: ' Категория 1',
 subcadegory: [
  {
    name: 'Подкатегория 1',
    data: [
    {Тут массив объектов состоящий из данных людей которые входят в 1 категорию и 1 подкатегорию}
    ]
  }
 ]
}
]


Т.е по сути из имеющегося массива нужно создать массив объектов, каждый объект это отдельная категория, в котором будет вложен еще один массив объектов состоящий из подкатегорий, а уже в нем будут данные людей которые им принадлежат.
Никак не могу понять как это сделать через reduce, я уже пытался написать сам но далеко не продвинулся и ушел в другую степь
let a = arr.reduce((accum, current) => {
	if(accum.some((item) => Object.values(item).includes(current.category.name))){
  	
  } else {
  	accum.push({
      category: current.category.name
    });
  }
  
	return accum;
},[]);
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Object
  .entries(arr.reduce((acc, n) => (
    ((acc[n.category.name] ??= {})[n.subCategory.name] ??= []).push(n),
    acc
  ), {}))
  .map(n => ({
    name: n[0],
    subcategory: Object
      .entries(n[1])
      .map(m => ({ name: m[0], data: m[1] })),
  }))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы