От новичка до гуру: Курсы программирования на CyberDuff

Добавьте новое свойство в исходную древовидную структуру при рекурсивной итерации

Ниже представлена ​​древовидная структура

 data= [
            {
              "name": "Company",
              "url": "",
              "submenu": [
                {
                  "name": "Company Wiki",
                  "url": "",
                  "submenu": [
                    {
                        "name": "Company Wiki2",
                        "url": "",
                        "submenu": [{
                            "name": "Company Wiki3",
                            "url": "http://my.company.co/wiki",
                            "submenu":null
                        }]                      
                    }
                  ]
                },
                {
                  "name": "Company Jira",
                  "url": "https://facebook.com",
                  "submenu": null
                },
                {
                  "name": "Google",
                  "url": "http://www.google.com",
                  "submenu": null
                },
                {
                  "name": "Yahoo",
                  "url": "http://www.yahoo.com",
                  "submenu": null
                }, {
                    "name": "Company ",
                    "url": "http://www.Company.io",
                    "submenu": null
                }, {
                    "name": "Test Submenu6",
                    "url": "http://www.Company.io",
                    "submenu": null
                }, {
                    "name": "Test Submenu7",
                    "url": "http://www.Company.io",
                    "submenu": null
                }, {
                    "name": "Test Submenu8",
                    "url": "http://www.Company.io",
                    "submenu": null
                }
              ]
            },
            {
                "name": "Department",
                "submenu": [{
                    "name": "Department Wiki",
                    "url": "http://my.company.co/wiki",
                    "submenu": null
                }, {
                    "name": "Test Wiki",
                    "url": "http://my.company.co/wiki",
                    "submenu": null
                }]
            }, {
                "name": "Documents",
                "url": "http://my.company.co/wiki",
                "submenu": null
            }
          ];

У меня есть набор значений

   ["Company", "Company Wiki", "Company Wiki2",  "Company Wiki3"]

Мне нужно изменить приведенную выше древовидную структуру таким образом, чтобы узлы с указанными выше именами содержали свойство с именем visible true.

  function transverse (root, newArr, visibleSet) {
debugger;
if(visibleSet.has(root.name)) {
    root =  {...root, visible:true}
}else {
    root = {...root, visible:false}
}
 newArr.push(root);

 if (root.sub === null || root.sub.length === 0) {  

     return root;
 }

 if (root.hasOwnProperty("sub") && root.sub instanceof Array)
    root.sub.map(child => {
        transverse(child, newArr, visibleSet);
    });

}

 var str = "";
 data.forEach(item => {
     newData.push(transverse(item,[], visibleSet));
});

Приведенный выше код добавляет свойство visible:true на основе имени, но структура дерева не сохраняется при добавлении узла обратно в массив. Как сохранить структуру дерева в рекурсивном цикле при добавлении к нему нового свойства? Или создать дубликат дерева с той же структурой.

23.07.2019

Ответы:


1

Вы можете использовать рекурсивный подход, ища заданные значения и обновляя их с помощью функции.

function update(array, fn, [key, ...keys]) {
    return array.some(o => {
        if (o.name === key) {
            if (!keys.length) {
                fn(o);
                return true;
            }
            return update(o.submenu, fn, keys);
        }
    });
}


var data = [{ name: "Company", url: "", submenu: [{ name: "Company Wiki", url: "", submenu: [{ name: "Company Wiki2", url: "", submenu: [{ name: "Company Wiki3", url: "http://my.company.co/wiki", icon: "folder_shared", submenu: null }] }] }, { name: "Company Jira", url: "https://facebook.com", submenu: null }, { name: "Google", url: "http://www.google.com", submenu: null }, { name: "Yahoo", url: "http://www.yahoo.com", submenu: null }, { name: "Company ", url: "http://www.Company.io", submenu: null }, { name: "Test Submenu6", url: "http://www.Company.io", submenu: null }, { name: "Test Submenu7", url: "http://www.Company.io", submenu: null }, { name: "Test Submenu8", url: "http://www.Company.io", submenu: null }] }, { name: "Department", submenu: [{ name: "Department Wiki", url: "http://my.company.co/wiki", submenu: null }, { name: "Test Wiki", url: "http://my.company.co/wiki", submenu: null }] }, { name: "Documents", url: "http://my.company.co/wiki", submenu: null }],
    keys = ["Company", "Company Wiki", "Company Wiki2", "Company Wiki3"];
  

update(data, o => o.visible = true, keys);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

23.07.2019
Новые материалы

Отслеживание состояния с течением времени с дифференцированием снимков
Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

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

Игра в прятки с данными
Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

«Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

Все о кейсах: Camel, Snake, Kebab & Pascal
В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..

Как работает дистанционное парное программирование и почему оно может изменить вашу жизнь
Серебряная пуля от одиночества и отвлекающих факторов во время обучения программированию Независимо от того, работаете ли вы или учитесь удаленно, велика вероятность, что одиночество и..