Рекурсивная функция для построения дерева
Всем привет.
Нужна функция, которая преобразует этот массив: Код:
[Код:
[Помогите пожалуйста |
|
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, время: 15:17. |