Рекурсивная функция для построения дерева
Всем привет.
Нужна функция, которая преобразует этот массив: Код:
[ Код:
[ Помогите пожалуйста |
|
1) Предполагаем, что чилд может появиться в массиве раньше своего парента
2) Дерево состоит из тех же объектов, которые лежат в массиве, некоторые из них модифицируются. Если надо делать копию, то в строке 5 заменить arr[i] на создание копии arr[i] function createTree(arr) { if (!arr || !arr.length) { return []; } var tree = [], map = new Map(); for (var i = 0, len = arr.length; i < len; ++i) { var item = arr[i]; var mapItem = map.get(item.id); if (!mapItem || Array.isArray(mapItem)) { if (mapItem) { item.children = mapItem; } map.set(item.id, item); } if (item.parentId == null) { tree.push(item); } else { var parentItem = map.get(item.parentId); if (!parentItem) { map.set(item.parentId, [item]); } else { var children = Array.isArray(parentItem) ? parentItem : (parentItem.children = parentItem.children || []); children.push(item); } } } return tree; } |
Извиняюсь, пришлось срочно уехать, только вернулся в тему.
Большое спасибо всем, особенно Alexandroppolus, помогли! |
Ещё вариант...
function createTree(array = []) { var map = new Map(); for(const item of array) if(map.has(item.parentId)) map.get(item.parentId).push(item); else map.set(item.parentId, [item]); for(const [parentId, items] of map) for(const item of items) if(map.has(item.id)) item.children = map.get(item.id); return map.get(null); } В исходном массиве элементы могут идти в любом порядке! |
Цитата:
а варианты лучше по скорости выполнения сравнивать, на большом массиве. Я не сравнивал, но асимптотика твоего варианта - O(N^2), а у способов с картой - O(N) или O(N*ln(N)), смотря как там карта устроена |
Цитата:
function createTree(array = []) { var map = new Map(); for(const item of array) if(map.has(item.parentId)) map.get(item.parentId).push(item); else map.set(item.parentId, [item]); for(const [parentId, items] of map) for(const item of items) if(map.has(item.id)) item.children = map.get(item.id); return map.get(null); }И тут уже есть определение функции createTree! А у вас его нет! Так где же ваша компактность, когда на каждый массив придётся писать... const Новый_массив = Массив.filter(зн => зн.parentId === null).map(зн => Найти_выродков(Массив, зн));против более компактного createTree(Массив);от Alexandroppolus! Цитата:
|
Часовой пояс GMT +3, время: 13:05. |