Перебор вложенных массивов объектов
Есть такое иерархическое дерево
const graph = {
value: 65, children: [{
value: 15,
children: [{
value: 55,
children: [{
value: 85,
children: [{
value: 66,
children: [{ value: 29 }, { value: 21 }]
}]
}]
}]
}]
};
Как можно, например, найти узел с максимальным/минимальным значением, с помощью map(), reduce(). Не могу понять как "копать" вглубь |
Зачем там map или reduce - хз, а так - рекурсивно.)
|
Epitough,
<script>
const graph = {
value: 65, children: [{
value: 15,
children: [{
value: 55,
children: [{
value: 85,
children: [{
value: 66,
children: [{ value: 29 }, { value: 21 }]
}]
}]
}]
}]
};
let example = foo(graph);
function foo(elem) {
let obj = {
max: elem.value,
min: elem.value
};
if (elem.children) {
elem.children.map(foo).forEach(
function(o) {
obj.max = Math.max(obj.max, o.max);
obj.min = Math.min(obj.min, o.min);
}
);
}
return obj;
}
document.write(JSON.stringify(example))
</script>
|
в некоторых задачах можно (эх не красиво), но кода то мало, сейчас камни полетят :lol:
<script>
const graph = {
value: 65, children: [{
value: 15,
children: [{
value: 55,
children: [{
value: 85,
children: [{
value: 66,
children: [{ value: 29 }, { value: 21 }]
}]
}]
}]
}]
};
const arr = JSON.stringify(graph).match(/(-?\d+)/g);
document.write(`Min: ${Math.min(...arr)}, Max: ${Math.max(...arr)}`)
</script>
|
А что делает map без функции, но с аргументом. Или это, получается, рекурсия? foo не вызывается, а становится функцией callback для map? Правильно понимаю?
|
Epitough,
... обычный map с функцией ... |
Цитата:
<script>
const graph = {
value: 65, children: [{
value: 15,
children: [{
value: 55,
children: [{
value: 85,
children: [{
value: 66,
children: [{ value: 29 }, { value: 21 }]
}]
}]
}]
}]
};
let example = foo(graph);
function foo(elem) {
let obj = {
max: elem.value,
min: elem.value
};
if (elem.children) {
elem.children.map(foo).reduce(
function(obj,o) {
obj.max = Math.max(obj.max, o.max);
obj.min = Math.min(obj.min, o.min);
return obj
}, obj
);
}
return obj;
}
document.write(JSON.stringify(example))
</script>
|
<script>
const graph = {
value: 65,
children: [{
value: 15,
children: [{
value: 55,
children: [{
value: 85,
children: [{
value: 66,
children: [{
value: 29
}, {
value: 21
}]
}]
}]
}]
}]
};
const foo = data => {
let arr = [data.value]
while (data.children) {
data = data.children.pop();
arr.push(data.value)
}
return `Min: ${Math.min(...arr)}, Max: ${Math.max(...arr)}`
}
document.write(foo(graph))
</script>
циклом while можно заменить любую рекурсию вот и спрашивается зачем здесь map(), reduce()? :dance: |
Цитата:
|
Цитата:
этот цикл не заходит в чилды элементов, которые сами по себе не последние чилды. чуть поменял данные, можно увидеть баг - минимум неверный |
| Часовой пояс GMT +3, время: 11:47. |