const tree = {
v: [
{
v: 1,
c: [
{
v: 2
},
{
v: 3,
c: [
{
v: 4,
}
]
},
{
v: 5,
c: [
{
v: 6,
c: [
{
v: 7
}
]
}
]
},
]
},
{
v: 8,
c: [
{
v: 9
},
{
v: 10,
c: [
{
v: 11,
}
]
},
{
v: 12,
},
]
}
],
c: {
v: 13,
c: [
{
v: 14,
}
]
}
}
const solution = (object) => {
let output = [];
const stack = [object];
while (stack.length) {
const last = stack.pop();
if (last && typeof last.v === 'number') {
output.push(last.v);
}
if (last && Array.isArray(last.v)) {
last.v.forEach(node => stack.push(node));
}
if (last && Array.isArray(last.c)) {
last.c.forEach(node => stack.push(node));
}
if (last && typeof last.c === 'object') {
[last.c].forEach(node => stack.push(node));
}
}
return output.sort((a, b) => a - b);
}
console.log(solution(tree));
instanceof Object
.true
или false
.function getNestedData(data, test) {
const result = [];
for (const stack = [ data ]; stack.length;) {
const n = stack.pop();
if (n instanceof Object) {
stack.push(...Object.values(n).reverse());
}
if (test(n)) {
result.push(n);
}
}
return result;
}
console.log(getNestedData(tree, Number.isFinite));
v
всегда число ("v" for "value"),c
— опциональный массив дочерних элементов ("c" for "children").if (last && Array.isArray(last.v)) {
тут, видимо, лишняя.v
это массив.. Так что нужна, если данные именно такие.if (last && typeof last.c === 'object') {
, за исключением корневого свойства, где это таки объект.last