Получить путь к значению в объекте из вложенного массива

#javascript #arrays #recursion #path

#javascript #массивы #рекурсия #путь

Вопрос:

Как я могу получить путь к вложенному значению внутри этого вложенного массива:

 const categories = [
    {
        name: 'category1',
        subcategories: [
            {
                name: 'category2',
                subcategories: [],
            },
            {
                name: 'category3',
                subcategories: [
                    {
                        name: 'category4',
                        subcategories: [],
                    },
                ],
            },
        ],
    },
    {
        name: 'category5',
        subcategories: [],
    },
];
 

Мне нужно реализовать функцию, которая вернет что-то вроде этого:

console.log(getCategoryPath(categories, ‘category4’)); // должен выводить: ‘/category1/ category3/category4’

До сих пор у меня:

 const getCategoryPath() = (categories, categoryName) {
    if (category.name === categoryName) {
        path = `/${category.name}`;
    } else {
        category.subcategories.find((firstLevelSubcategory) => {
            if (firstLevelSubcategory.name === categoryName) {
                path = `/${firstLevelSubcategory.name}`;
            } else {
                firstLevelSubcategory.subcategories.find(
                    (secondLevelSubcategory) => {
                        if (secondLevelSubcategory.name === categoryName) {
                            path = `/${secondLevelSubcategory.name}`;
                        }
                    }
                );
            }
        });
    }
}
 

Например, при этом выводится соответствующее название категории /category4 , но мне нужно будет вывести весь путь к этому значению /category1/category3/category4 .

В этом случае мне не удается идентифицировать родителя / родителей соответствия categoryName . Могу ли я использовать рекурсию для решения этой проблемы, и если да, то как я могу ее применить?

Ответ №1:

Вы можете применить рекурсию:

 const categories = [ { name: 'category1', subcategories: [ { name: 'category2', subcategories: [], }, { name: 'category3', subcategories: [ { name: 'category4', subcategories: [], }, ], }, ], }, { name: 'category5', subcategories: [], },];

const getNestedPath=(arr,name)=>{
    for(let item of arr){
        if(item.name===name) return `/${name}`;
        if(item.subcategories) {
            const child = getNestedPath(item.subcategories, name);
            if(child) return `/${item.name}${child}`
        }
    }
};

console.log(getNestedPath(categories, 'category4'));