[
{
"id": 1,
"name": "Бумага",
"children" :[
{
"id": 2,
"name": "Бумага офисная",
"children" :[
{
"id": 3,
"name": "Бумага для принтера"
},
{
"id": 4,
"name": "Бумага для цветная"
}
]
}
]
},
{
"id": 5,
"name": "Товары для офиса",
"children" :[
{
"id": 6,
"name": "Оборудование",
"children" :[
{
"id": 7,
"name": "Для досок"
},
{
"id": 8,
"name": "Бэйджики"
}
]
}
]
},
{
"id": 9,
"name": "Товары для школы",
"children" :[
{
"id": 10,
"name": "Подарки",
"children" :[
{
"id": 11,
"name": "Конфеты"
},
{
"id": 12,
"name": "Игрушки"
}
]
}
]
}
]
[
{
"id": 3,
"name": "Бумага для принтера"
},
{
"id": 4,
"name": "Бумага для цветная"
},
{
"id": 7,
"name": "Для досок"
},
{
"id": 8,
"name": "Бэйджики"
},
{
"id": 11,
"name": "Конфеты"
},
{
"id": 12,
"name": "Игрушки"
}
]
function getLeaves(tree) {
const result = [];
for (const stack = [...tree]; stack.length;) {
const n = stack.pop();
if (Array.isArray(n.children) && n.children.length) {
stack.push(...n.children);
} else {
result.push(n);
}
}
return result.reverse();
}
const leaves = getLeaves(tree);
const getFromTree = function*(tree, test) {
const stack = [];
for (let [ i, arr ] = this(tree); ++i < arr.length || stack.length;) {
if (i === arr.length) {
[ i, arr ] = stack.pop();
} else {
if (test(arr[i])) {
yield arr[i];
}
stack.push([ i, arr ]);
[ i, arr ] = this(arr[i].children);
}
}
}.bind(x => [ -1, x instanceof Array ? x : [] ]);
const leaves = [...getFromTree(tree, n => !n.children?.length)];