12.11.2018, 22:42
|
Новичок на форуме
|
|
Регистрация: 12.11.2018
Сообщений: 7
|
|
Перебор вложенных массивов объектов
Есть такое иерархическое дерево
const graph = {
value: 65, children: [{
value: 15,
children: [{
value: 55,
children: [{
value: 85,
children: [{
value: 66,
children: [{ value: 29 }, { value: 21 }]
}]
}]
}]
}]
};
Как можно, например, найти узел с максимальным/минимальным значением, с помощью map(), reduce(). Не могу понять как "копать" вглубь
|
|
12.11.2018, 23:07
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,587
|
|
Зачем там map или reduce - хз, а так - рекурсивно.)
__________________
29375, 35
|
|
12.11.2018, 23:40
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,120
|
|
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>
|
|
13.11.2018, 00:23
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
в некоторых задачах можно (эх не красиво), но кода то мало, сейчас камни полетят
<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>
|
|
13.11.2018, 17:23
|
Новичок на форуме
|
|
Регистрация: 12.11.2018
Сообщений: 7
|
|
А что делает map без функции, но с аргументом. Или это, получается, рекурсия? foo не вызывается, а становится функцией callback для map? Правильно понимаю?
|
|
13.11.2018, 17:43
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,120
|
|
Epitough,
... обычный map с функцией ...
|
|
13.11.2018, 17:47
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,120
|
|
Сообщение от Epitough
|
с помощью map(), reduce().
|
<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>
|
|
13.11.2018, 20:18
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
<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()?
|
|
13.11.2018, 20:35
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Сообщение от Poznakomlus
|
циклом while можно заменить любую рекурсию
|
Прямо таки любую?
|
|
13.11.2018, 20:59
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от Poznakomlus
|
<script>
const graph = {
value: 65,
children: [{
value: 15,
children: [{
value: 55,
children: [{
value: 85,
children: [{
value: 66,
children: [{
value: 29
}, {
value: 1
}]
}, {value: 888}]
}]
}]
}]
};
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()?
|
не сразу понял как тут без рекурсии обошлось )
этот цикл не заходит в чилды элементов, которые сами по себе не последние чилды.
чуть поменял данные, можно увидеть баг - минимум неверный
|
|
|
|