Ещё вариант...
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);
}
В исходном массиве элементы могут идти в любом порядке!