Недавно я разрабатывал модуль управления разрешениями для внутренней системы управления, который включает в себя логику обработки данных различных древовидных структур, таких как: добавление, удаление. , модификация, запрос и т. д.; по сравнению с обычными данными структуры массива, обработка древовидной структуры не так интуитивна, как массива, но требует еще одного шага — рекурсивного поиска для выполнения глубокого обхода данных. Здесь блоггер также подведет итог процесса разработки. Я поделюсь методом, который придумал. Эта статья даст вам полное представление об обработке данных в древовидной структуре JS:
Пример структуры данных
let data = [{ идентификатор: 1, метка: «Уровень 1», дети: [{ идентификатор: 4, метка: «Уровень 1–1», дети: [{ идентификатор: 9, метка: «Уровень 3 1-1-1» }, { идентификатор: 10, метка: «Уровень 3 1-1-2» }] }] }, { идентификатор: 2, метка: «Уровень 2», дети: [{ идентификатор: 5, этикетка: «Уровень 2–1» }, { идентификатор: 6, этикетка: «Уровень 2–2» }] }, { идентификатор: 3, метка: «Уровень 3», дети: [{ идентификатор: 7, этикетка: «Уровень 2 3-1» }, { идентификатор: 8, этикетка: «Уровни 3–2» }] }]
, чтобы найти указанный узел в древовидной структуре и добавить новый дочерний узел. Код следующий:
const AppendNodeInTree = (id,tree,obj) => {. Tree.forEach(ele=> { если (ele.id === id) { ele.children ? ele.children.push(obj) : ele.children = [obj] } еще { если (ele.дети) { appendNodeInTree(id, ele.children, obj) } } }) вернуть дерево }
Найти указанный узел в древовидной структуре и удалить узел. Код следующий
const removeNodeInTree=(treeList, id)=> { // Удалить элементы из массива (деревовидной структуры) по идентификатору if. (!treeList || ! TreeList.length) { возвращаться } for (пусть я = 0; я <treeList.length; я++) { если (treeList[i].id === id) { TreeList.splice(я, 1); перерыв; } удалитьNodeInTree(treeList[i].children, id) } }
для рекурсивного поиска и изменения статуса узла. Код выглядит следующим образом:
const updateNodeInTree=(treeList,id, obj)=> {. if (!treeList || !treeList.length) { возвращаться; } for (пусть я = 0; я <treeList.length; я++) { если (treeList[i].id == id) { TreeList[i]= объект; перерыв; } updateNodeInTree(treeList[i].children,id,obj); } }
, чтобы найти узел в узле дерева, код:
const findNodeInTree = (данные, ключ, обратный вызов) => { for (пусть я = 0; я <data.length; я++) { if (data[i].key == ключ) { обратный обратный вызов (данные [i], я, данные) } если (данные[i].дети) { findNodeInTree (данные[i].дети, ключ, обратный вызов) } } } //Метод сохранения найденного узла let Obj={} findNodeInTree(данные, ключ, (элемент, индекс, обр.) => { Объект = элемент }) // Это узел, который нужно найти, соответствующий Obj console.log(Obj)