Перебор вложенных массивов объектов
Есть такое иерархическое дерево
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, время: 10:21. |