Новый бэкенд делает меню, 👦Backend говорит:
- меню на этот разУровень не фиксирован.
- напрямую в базуданные таблицы(массив) отправлен вам.
- меню потребностиСортировать.
На самом деле, я редко пишу об обработке данных, но я согласился, что почти смог бы этого добиться.После того, как я закончил писать, я подумал, что это очень полезно, поэтому я поделюсь этим.
Примечание: "Eleme/iview и другие библиотеки компонентов"Каскадный селектор"/"Меню навигации" и другие компоненты могут использовать следующие функции для упрощения операций.
Исходный код этой статьи:GitHub.com/easy86/ah пусть люди 2 его…
Цель
// 🚚 输入数组
const array = [{
id: 1,
name: '蔬菜',
order: 1
},
{
id: 2,
name: '土豆',
pid: 1,
order: 2
}, {
id: 3,
name: '豆角',
pid: 1,
order: 1
}, {
id: 4,
name: '水果',
order: 2
}
];
// 🚀 转换开始
arrayToTree(array);
// 📺输出:
//
// [
// {
// "id": 1,
// "name": "蔬菜",
// "order": 1,
// "children": [
// {
// "id": 3,
// "name": "豆角",
// "pid": 1,
// "order": 1
// },
// {
// "id": 2,
// "name": "土豆",
// "pid": 1,
// "order": 2
// }
// ]
// },
// {
// "id": 4,
// "name": "水果",
// "order": 2
// }
// ]
идеи
Логика очень проста, объясню пошагово:
- Сохраните «корневой узел» и остальные «дочерние узлы» в 2 переменные (контейнеры).
- Начиная с корня (родителя), проверьте каждый дочерний узел в контейнере «дочерний узел», найдите дочерний узел, соответствующий родительскому узлу, и сохраните его в дочернем поле, соответствующем родительскому узлу, в «контейнере дочернего узла». .
- Отсортируйте «узлы» в дочернем поле (здесь временно используется сортировка).
- Выполняйте «шаги 2 и 3» рекурсивно, пока «контейнер дочернего узла» не станет пустым.
- Повторите «шаги 2/3/4» для других «корневых узлов».
код
/**
* 数组转树
* @param {Array} 输入
* @param {Object.String} keyMap.KEY_ID 表示唯一性键值(id)
* @param {Object.String} keyMap.KEY_PID 对应的父id
* @param {Object.String} keyMap.KEY_ORDER 排序依据的键值
* @returns {Object} 树结构
*/
function arrayToTree(list, keyMap = {
KEY_ID: 'id',
KEY_PID: 'pid',
KEY_ORDER: 'order',
}) {
const {
KEY_ID,
KEY_PID,
KEY_ORDER
} = keyMap;
const roots = [];
// 当前非根节点
let childrenNode = [];
// 分组根和非根节点
list.forEach((item) => {
if (undefined === item[KEY_PID]) {
roots.push(item);
} else {
childrenNode.push(item);
}
});
// 遍历根节点
for (const root of roots) {
findChild(root);
}
// 递归单个根节点
function findChild(root) {
if (0 >= childrenNode.length) return;
let newChildNode = [];
childrenNode.forEach((child) => {
if (root[KEY_ID] === child[KEY_PID]) {
if (undefined === root.children) root.children = [];
root.children.push(child);
findChild(child /**new root */ );
} else {
newChildNode.push(child);
}
});
// 排序
if (undefined !== KEY_ORDER && root.children && 1 < root.children.length) {
root.children = root.children.sort((prev, current) => prev[KEY_ORDER] - current[KEY_ORDER]);
}
childrenNode = newChildNode;
}
return roots;
}
npm & github
Код этой статьи я сохранил на github и npm, и его можно установить и использовать через npm.
npm i -S arr2tree
GitHub.com/easy86/ah пусть люди 2 его…
Рекомендуется базовое руководство по Typescript
Наконец толкнул, чтобы написать свои собственные »Базовый учебник по машинописному тексту" и 😊😊 2 на основе разработки ТСмаленькие инструменты, Я надеюсь тебе понравится.
Урок 2, Основные типы и вводные расширенные типы
Урок 4. Интерпретация расширенных типов
Урок 5. Что такое пространство имен?
✋ Библиотека жестов для мобильных устройств/ПК, поддержка: касание/нажатие/панорамирование/пролистывание/вращение/сжатие GitHub.com/any86/anyi-he…
🍭 Превратите компонент vue в команду, подобную этой. $xxx GitHub.com/easy86/v UE-от…
Группа WeChat
Спасибо за чтение, если у вас есть какие-либо вопросы, вы можете добавить меня в WeChat, я приглашу васГруппа WeChat(Из-за ограничения Tencent на 100 участников в группах WeChat после того, как более 100 участников должны быть привлечены участниками группы)