Как преобразовать плоский массив категорий и подкатегорий в массив вложенных объектов, где каждая подкатегория вложена внутри своей родительской? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь преобразовать этот плоский массив категорий и подкатегорий

let flatCategories = [
        {
          name: "Junk food",
          id: 1,
          subcategoriesId: [2],
        },
        {
          name: "cookies",
          id: 2,
          subcategoriesId: [3, 4],
        },
        {
          name: "Chocolate chip cookies",
          id: 3,
          subcategoriesId: [],
        },
       {
          name: "peanut butter cookies",
          id: 4,
          subcategoriesId: [],
        }
      ];

в массив объектов категорий, которые содержат массив всех их объектов подкатегорий:

let categoriesTree = [
         {
          name: "Junk food",
          id: 1,
          subcategories: [
            {
              name: "cookies",
              id: 2,
              subcategories: [
                {
                  name: "Chocolate Chip cookies",
                  id: 3
                },
                {
                  name: "peanut butter cookies",
                  id: 4
                }
              ]
            }
          ]
        }
]

Я хочу, чтобы он был динамическим c и go на столько уровней, сколько необходимо. Я знаю, что для этого мне следует использовать рекурсивную функцию, но я просто не знаю, как ее реализовать.

1 Ответ

1 голос
/ 06 мая 2020

let flatCategories = [
  {
    name: "Junk food",
    id: 1,
    subcategoriesId: [2],
  },
  {
    name: "cookies",
    id: 2,
    subcategoriesId: [3, 4],
  },
  {
    name: "Chocolate chip cookies",
    id: 3,
    subcategoriesId: [],
  },
  {
    name: "peanut butter cookies",
    id: 4,
    subcategoriesId: [],
  },{
     name: "Root 2",
     id: 5,
     subcategoriesId: [2],
  },
];


//STEP 1. Find all subcategories.

const subCategoriesIds = flatCategories.reduce(
  (acc, c) => {acc.push(...c.subcategoriesId.filter(sc => !acc.includes(sc))); return acc}, []
);

//STEP 2. Find all root categories

const rootCategories = flatCategories.filter(fc => !subCategoriesIds.includes(fc.id));


//STEP 3. Make a function that will find subcategories by their ids

const getSubcategories = category => {
  if (category.subcategoriesId && category.subcategoriesId.length > 0) {
    const subcategories = flatCategories.filter(fc => category.subcategoriesId.includes(fc.id));
    category.subcategories = subcategories.map(sc => ({
      name: sc.name,
      id: sc.id,
      subcategories: getSubcategories(sc),
   }));
  }

  delete category.subcategoriesId;
  return category.subcategories
}

//STEP 4. Run function for all root categories

const categoryTree = rootCategories.map(fc => ({
  name: fc.name,
  id: fc.id,
  subcategories: getSubcategories(fc),
}));

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