Преобразование запутанного кода в рекурсивную функцию

У меня есть функция, которая создает компонент Select, используя массив с объектами, называемыми категориями услуг внутри этого, мы можем (или нет) иметь массив дочерних элементов, которые будут поставляться с новой категорией услуг (подкатегория с той же структурой). На самом деле у меня есть этот код (уродливый, но рабочий код)

function buildMenu() {
    setIsLoading(true);
    const newOptions = [];
    categories.map((category) => {
      const newCategory = {
        ...category,
        csslevel: 0,
      };
      newOptions.push(newCategory);
      const { children } = newCategory;
      if (Array.isArray(children)) {
        children.map((child) => {
          const newChildren = {
            ...child,
            csslevel: 2,
          };
          newOptions.push(newChildren);
          if (Array.isArray(newChildren.children)) {
            const subchildl1 = newChildren.children;
            subchildl1.map((subchild2) => {
              const newSubchild2 = {
                ...subchild2,
                csslevel: 5,
              };
              newOptions.push(newSubchild2);
              if (Array.isArray(newSubchild2.children)) {
                const subchild3 = newSubchild2.children;
                subchild3.map((subchildl4) => {
                  const newSubchild4 = {
                    ...subchildl4,
                    csslevel: 7,
                  };
                  newOptions.push(newSubchild4);
                  if (Array.isArray(newSubchild4.children)) {
                    const subchild5 = newSubchild4.children;
                    subchild5.map((subchild6) => {
                      const newSubchild6 = {
                        ...subchild6,
                        csslevel: 9,
                      };
                      newOptions.push(newSubchild6);
                      if (Array.isArray(newSubchild6.children)) {
                        const subchildl7 = newSubchild6.children;
                        subchildl7.map((subchildl8) => {
                          const newSubchild8 = {
                            ...subchildl8,
                            csslevel: 11,
                          };
                          newOptions.push(newSubchild8);
                          if (Array.isArray(newSubchild8.children)) {
                            const subchildl9 = newSubchild8.children;
                            subchildl9.map((subchildl10) => {
                              const newSubchild10 = {
                                ...subchildl10,
                                csslevel: 13,
                              };
                              newOptions.push(newSubchild8);
                            });
                          }
                        });
                      }
                    });
                  }
                });
              }
            });
          }
        });
      }
      setOptions(newOptions);
    });
    setIsLoading(false);
  }

в основном, мне нужен компонент Select (ReactJS/Material-ui), который отображает эту категорию и его соответствующие подкатегории.

Обратите внимание, что, как и подкатегория, это категория с дочерним элементом, и у нас может быть бесконечное количество подкатегорий внутри подкатегорий, что-то вроде примера ниже:

[
    {
        ...categoryInfo,
        children: [
            {
                ...subcategoryInfo,
                children: [
                    {
                        ...yesAnewSubcategory,
                        children: [...]

                    }
                ]
            },
            {
                ...subcategoryInfo,

            }
        ]
    }
]

Он действительно создает компонент Select с параметрами, мне нужно показать все в выборе, но с пробелами, указывающими, что это подкатегория другой категории/подкатегории. Но я знаю, что через какое-то время это достигнет предела Array.isArray(child) внутри Array.isArray(child).

РЕДАКТИРОВАТЬ: эти данные поступают из запроса API. Я хочу использовать рекурсию, которая создает новый массив с каждой категорией/подкатегорией на том же уровне в массиве, но с увеличением cssLevel для каждого уровня подкатегории.


{
  "data": [
    {
      "id": 34,
      "name": "Serviços Premium",
      "slug": "servicos-premium",
      "cover_image": {
        "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
        "mobile_thumb": {
          "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
        }
      },
      "cover_image_cache": null,
      "icon": {
        "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
        "mobile_thumb": {
          "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
        }
      },
      "icon_cache": null,
      "html_class_name": null,
      "position": 4,
      "aasm_state": "enabled",
      "system_code": 100042,
      "business_id": 3,
      "parent_id": null,
      "parents_count": 0,
      "parents": [null],
      "date_last_sync": null,
      "children": [
        {
          "id": 35,
          "name": "Cats Premium",
          "slug": "cats-premium",
          "cover_image": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "cover_image_cache": null,
          "icon": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "icon_cache": null,
          "html_class_name": null,
          "position": 5,
          "aasm_state": "enabled",
          "system_code": 100043,
          "business_id": 3,
          "parent_id": 34,
          "parents_count": 1,
          "parents": [{ "id": 34, "name": "Serviços Premium" }, null],
          "date_last_sync": null,
          "children": [
            {
              "id": 36,
              "name": "Cats Premium Male",
              "slug": "cats-premium-male",
              "cover_image": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "cover_image_cache": null,
              "icon": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "icon_cache": null,
              "html_class_name": null,
              "position": 6,
              "aasm_state": "enabled",
              "system_code": 100044,
              "business_id": 3,
              "parent_id": 35,
              "parents_count": 1,
              "parents": [{ "id": 35, "name": "Cats Premium" }, null],
              "date_last_sync": null,
              "children": [
                {
                  "id": 37,
                  "name": "Cats Premium Female",
                  "slug": "cats-premium-female",
                  "cover_image": {
                    "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                    "mobile_thumb": {
                      "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                    }
                  },
                  "cover_image_cache": null,
                  "icon": {
                    "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                    "mobile_thumb": {
                      "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                    }
                  },
                  "icon_cache": null,
                  "html_class_name": null,
                  "position": 7,
                  "aasm_state": "enabled",
                  "system_code": 100045,
                  "business_id": 3,
                  "parent_id": 36,
                  "parents_count": 1,
                  "parents": [{ "id": 36, "name": "Cats Premium Male" }, null],
                  "date_last_sync": null,
                  "children": [],
                  "chain_name": "Cats Premium Male > Cats Premium Female"
                }
              ],
              "chain_name": "Cats Premium > Cats Premium Male"
            },
            {
              "id": 38,
              "name": "Cats Diamond",
              "slug": "cats-diamond",
              "cover_image": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "cover_image_cache": null,
              "icon": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "icon_cache": null,
              "html_class_name": null,
              "position": 8,
              "aasm_state": "enabled",
              "system_code": 100046,
              "business_id": 3,
              "parent_id": 35,
              "parents_count": 1,
              "parents": [{ "id": 35, "name": "Cats Premium" }, null],
              "date_last_sync": null,
              "children": [],
              "chain_name": "Cats Premium > Cats Diamond"
            },
            {
              "id": 45,
              "name": "Subcategoria de Cats Premium",
              "slug": "subcategoria-de-cats-premium",
              "cover_image": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "cover_image_cache": null,
              "icon": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "icon_cache": null,
              "html_class_name": null,
              "position": 15,
              "aasm_state": "enabled",
              "system_code": 100053,
              "business_id": 3,
              "parent_id": 35,
              "parents_count": 1,
              "parents": [{ "id": 35, "name": "Cats Premium" }, null],
              "date_last_sync": null,
              "children": [],
              "chain_name": "Cats Premium > Subcategoria de Cats Premium"
            }
          ],
          "chain_name": "Serviços Premium > Cats Premium"
        },
        {
          "id": 39,
          "name": "Dogs Diamond",
          "slug": "dogs-diamond",
          "cover_image": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "cover_image_cache": null,
          "icon": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "icon_cache": null,
          "html_class_name": null,
          "position": 9,
          "aasm_state": "enabled",
          "system_code": 100047,
          "business_id": 3,
          "parent_id": 34,
          "parents_count": 1,
          "parents": [{ "id": 34, "name": "Serviços Premium" }, null],
          "date_last_sync": null,
          "children": [],
          "chain_name": "Serviços Premium > Dogs Diamond"
        },
        {
          "id": 40,
          "name": "Dogs Premium",
          "slug": "dogs-premium",
          "cover_image": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "cover_image_cache": null,
          "icon": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "icon_cache": null,
          "html_class_name": null,
          "position": 10,
          "aasm_state": "enabled",
          "system_code": 100048,
          "business_id": 3,
          "parent_id": 34,
          "parents_count": 1,
          "parents": [{ "id": 34, "name": "Serviços Premium" }, null],
          "date_last_sync": null,
          "children": [
            {
              "id": 41,
              "name": "Banho Dogs Premium",
              "slug": "banho-dogs-premium",
              "cover_image": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "cover_image_cache": null,
              "icon": {
                "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
                "mobile_thumb": {
                  "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
                }
              },
              "icon_cache": null,
              "html_class_name": null,
              "position": 11,
              "aasm_state": "enabled",
              "system_code": 100049,
              "business_id": 3,
              "parent_id": 40,
              "parents_count": 1,
              "parents": [{ "id": 40, "name": "Dogs Premium" }, null],
              "date_last_sync": null,
              "children": [],
              "chain_name": "Dogs Premium > Banho Dogs Premium"
            }
          ],
          "chain_name": "Serviços Premium > Dogs Premium"
        },
        {
          "id": 43,
          "name": "Consulta Veterinária",
          "slug": "consulta-veterinaria",
          "cover_image": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "cover_image_cache": null,
          "icon": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "icon_cache": null,
          "html_class_name": null,
          "position": 13,
          "aasm_state": "enabled",
          "system_code": 100051,
          "business_id": 3,
          "parent_id": 34,
          "parents_count": 1,
          "parents": [{ "id": 34, "name": "Serviços Premium" }, null],
          "date_last_sync": null,
          "children": [],
          "chain_name": "Serviços Premium > Consulta Veterinária"
        },
        {
          "id": 44,
          "name": "PetCare",
          "slug": "petcare",
          "cover_image": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "cover_image_cache": null,
          "icon": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "icon_cache": null,
          "html_class_name": null,
          "position": 14,
          "aasm_state": "enabled",
          "system_code": 100052,
          "business_id": 3,
          "parent_id": 34,
          "parents_count": 1,
          "parents": [{ "id": 34, "name": "Serviços Premium" }, null],
          "date_last_sync": null,
          "children": [],
          "chain_name": "Serviços Premium > PetCare"
        }
      ],
      "chain_name": "Serviços Premium"
    },
    {
      "id": 3,
      "name": "Teste 002 edit",
      "slug": "teste-002",
      "cover_image": {
        "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
        "mobile_thumb": {
          "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
        }
      },
      "cover_image_cache": null,
      "icon": {
        "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
        "mobile_thumb": {
          "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
        }
      },
      "icon_cache": null,
      "html_class_name": null,
      "position": 3,
      "aasm_state": "enabled",
      "system_code": 100011,
      "business_id": 3,
      "parent_id": null,
      "parents_count": 0,
      "parents": [null],
      "date_last_sync": null,
      "children": [
        {
          "id": 42,
          "name": "Um novo teste",
          "slug": "um-novo-teste",
          "cover_image": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "cover_image_cache": null,
          "icon": {
            "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png",
            "mobile_thumb": {
              "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png"
            }
          },
          "icon_cache": null,
          "html_class_name": null,
          "position": 12,
          "aasm_state": "enabled",
          "system_code": 100050,
          "business_id": 3,
          "parent_id": 3,
          "parents_count": 1,
          "parents": [{ "id": 3, "name": "Teste 002 edit" }, null],
          "date_last_sync": null,
          "children": [],
          "chain_name": "Teste 002 edit > Um novo teste"
        }
      ],
      "chain_name": "Teste 002 edit"
    }
  ]
}

Кто-нибудь может мне помочь? Спасибо!


person Luciano dii Souza    schedule 26.04.2021    source источник
comment
Можете ли вы объяснить логику значения csslevel? И можете ли вы поделиться некоторыми примерами данных и ожидаемым результатом?   -  person Arun Kumar Mohan    schedule 26.04.2021
comment
это результат, который строит функция: imgur.com/LvNWJ9m, я обновил запрос, добавив немного json данные, поступающие из API.   -  person Luciano dii Souza    schedule 26.04.2021
comment
Извините, у меня пропадает интернет, когда я нажимаю кнопку обновления, но теперь он сохраняется. csslevel - это количество пробелов в подкатегориях выбранного компонента (как вы можете видеть на изображении), есть пробел, чтобы отличать его от родительской категории. шаблон 0, 2, 5, 7 - это просто количество пробелов, это может быть два пробела для каждого уровня, без проблем   -  person Luciano dii Souza    schedule 26.04.2021
comment
это вернет одно состояние массива (useState([])), с каждой категорией/подкатегорией в качестве объекта внутри этого массива. Вы можете увидеть ожидаемый результат здесь: api.npoint.io/3e312f1d7ee3b2a601e7 (я рекомендую расширение json viewer, потому что этот json слишком большой). Цель состоит в том, чтобы использовать array.map для отображения каждого объекта внутри компонента Select. используя cssLevel, чтобы добавить пробелы слева от опции.   -  person Luciano dii Souza    schedule 26.04.2021


Ответы (1)


Для каждой группы параметров вы можете вызвать функцию getOptions, которая возвращает параметр родительской категории (со свойствами name и csslevel) и использует Array.prototype.flatMap для отображения дочернего массива, рекурсивного вызова функции getOptions и сглаживания результата, возвращая родительские и дочерние параметры в массиве.

const data = [ { "id": 34, "name": "Serviços Premium", "slug": "servicos-premium", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 4, "aasm_state": "enabled", "system_code": 100042, "business_id": 3, "parent_id": null, "parents_count": 0, "parents": [null], "date_last_sync": null, "children": [ { "id": 35, "name": "Cats Premium", "slug": "cats-premium", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 5, "aasm_state": "enabled", "system_code": 100043, "business_id": 3, "parent_id": 34, "parents_count": 1, "parents": [{ "id": 34, "name": "Serviços Premium" }, null], "date_last_sync": null, "children": [ { "id": 36, "name": "Cats Premium Male", "slug": "cats-premium-male", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 6, "aasm_state": "enabled", "system_code": 100044, "business_id": 3, "parent_id": 35, "parents_count": 1, "parents": [{ "id": 35, "name": "Cats Premium" }, null], "date_last_sync": null, "children": [ { "id": 37, "name": "Cats Premium Female", "slug": "cats-premium-female", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 7, "aasm_state": "enabled", "system_code": 100045, "business_id": 3, "parent_id": 36, "parents_count": 1, "parents": [{ "id": 36, "name": "Cats Premium Male" }, null], "date_last_sync": null, "children": [], "chain_name": "Cats Premium Male > Cats Premium Female" } ], "chain_name": "Cats Premium > Cats Premium Male" }, { "id": 38, "name": "Cats Diamond", "slug": "cats-diamond", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 8, "aasm_state": "enabled", "system_code": 100046, "business_id": 3, "parent_id": 35, "parents_count": 1, "parents": [{ "id": 35, "name": "Cats Premium" }, null], "date_last_sync": null, "children": [], "chain_name": "Cats Premium > Cats Diamond" }, { "id": 45, "name": "Subcategoria de Cats Premium", "slug": "subcategoria-de-cats-premium", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 15, "aasm_state": "enabled", "system_code": 100053, "business_id": 3, "parent_id": 35, "parents_count": 1, "parents": [{ "id": 35, "name": "Cats Premium" }, null], "date_last_sync": null, "children": [], "chain_name": "Cats Premium > Subcategoria de Cats Premium" } ], "chain_name": "Serviços Premium > Cats Premium" }, { "id": 39, "name": "Dogs Diamond", "slug": "dogs-diamond", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 9, "aasm_state": "enabled", "system_code": 100047, "business_id": 3, "parent_id": 34, "parents_count": 1, "parents": [{ "id": 34, "name": "Serviços Premium" }, null], "date_last_sync": null, "children": [], "chain_name": "Serviços Premium > Dogs Diamond" }, { "id": 40, "name": "Dogs Premium", "slug": "dogs-premium", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 10, "aasm_state": "enabled", "system_code": 100048, "business_id": 3, "parent_id": 34, "parents_count": 1, "parents": [{ "id": 34, "name": "Serviços Premium" }, null], "date_last_sync": null, "children": [ { "id": 41, "name": "Banho Dogs Premium", "slug": "banho-dogs-premium", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 11, "aasm_state": "enabled", "system_code": 100049, "business_id": 3, "parent_id": 40, "parents_count": 1, "parents": [{ "id": 40, "name": "Dogs Premium" }, null], "date_last_sync": null, "children": [], "chain_name": "Dogs Premium > Banho Dogs Premium" } ], "chain_name": "Serviços Premium > Dogs Premium" }, { "id": 43, "name": "Consulta Veterinária", "slug": "consulta-veterinaria", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 13, "aasm_state": "enabled", "system_code": 100051, "business_id": 3, "parent_id": 34, "parents_count": 1, "parents": [{ "id": 34, "name": "Serviços Premium" }, null], "date_last_sync": null, "children": [], "chain_name": "Serviços Premium > Consulta Veterinária" }, { "id": 44, "name": "PetCare", "slug": "petcare", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 14, "aasm_state": "enabled", "system_code": 100052, "business_id": 3, "parent_id": 34, "parents_count": 1, "parents": [{ "id": 34, "name": "Serviços Premium" }, null], "date_last_sync": null, "children": [], "chain_name": "Serviços Premium > PetCare" } ], "chain_name": "Serviços Premium" }, { "id": 3, "name": "Teste 002 edit", "slug": "teste-002", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 3, "aasm_state": "enabled", "system_code": 100011, "business_id": 3, "parent_id": null, "parents_count": 0, "parents": [null], "date_last_sync": null, "children": [ { "id": 42, "name": "Um novo teste", "slug": "um-novo-teste", "cover_image": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "cover_image_cache": null, "icon": { "url": "https://cdn-sandbox.petbooking.com.br/assets/fallbacks/cover_image-a16120b79ad694c51ee09eabe2cd8ad8.png", "mobile_thumb": { "url": "https://cdn-sandbox.petbooking.com.br/fallbacks/cover_image_mobile_thumb.png" } }, "icon_cache": null, "html_class_name": null, "position": 12, "aasm_state": "enabled", "system_code": 100050, "business_id": 3, "parent_id": 3, "parents_count": 1, "parents": [{ "id": 3, "name": "Teste 002 edit" }, null], "date_last_sync": null, "children": [], "chain_name": "Teste 002 edit > Um novo teste" } ], "chain_name": "Teste 002 edit" } ]

const getOptions = ({ name, children = [], spacing = 0 }) => [
  { name, csslevel: spacing },
  ...children.flatMap((child) =>
    getOptions({ ...child, spacing: spacing + 2 })
  ),
]

const options = data.flatMap(getOptions)
console.log(options)

person Arun Kumar Mohan    schedule 26.04.2021
comment
Это действительно решило мою проблему! я добавил метод .flat() в окончательный возврат массива, чтобы получить только один массив и повторить его на моем экране реакции. у меня нет слов, чтобы отблагодарить вас! я потратил впустую одну неделю или больше, просто пытаясь сделать это =/. Большое спасибо! - person Luciano dii Souza; 26.04.2021
comment
@LucianodiiSouza Я не был уверен в ожидаемой структуре вывода. Только что обновил свой ответ, чтобы использовать flatMap. Кстати, вы можете добавить жирный шрифт к имени параметра, если csslevel равно 0. Пожалуйста. - person Arun Kumar Mohan; 26.04.2021