Как правильно обработать объект в рекурсии, чтобы можно было искать min, max среди value?
структура объекта:
Node = {
value: <number>,
children: [Node]
}
функция:
const deepMap = (obj) =>{
//maxValue =(maxValue.value < obj.value) ? obj : maxValue;
console.log( obj);
obj.children ? obj.children.map(item => deepMap(item)) : obj;
};
часть объекта
var graph = {
value: 75,
children: [{
value: 18,
children: [{
value: 35,
children: [{
value: 35,
children: [{
value: 66,
children: [{
value: 29,
children: [{value: 85}]
}]
}]
}]
}]
}]
}
В примере кода в вопросе отсутствует return
, следовательно данная функция ничего не выводит, но она уже пробегает по всем элементам в графе.
Первое что нужно изменить: добавить return
, который будет возвращать нужное значение.
Нужным в данном случае является максимум из нескольких чисел: значения поля value
, и значений из поля children
.
Применяя функцию deepMap
к каждому элементу массива children
можно на каждом уровне иметь список максимальных значений.
Для нахождения максимального числа из нескольких можно применить функцию Math.max
, а так же spread operator, позволяющей удобно передать в нее массив.
Так как поле children
может отсутствовать, нужно добавить соответствующую проверку и в случае ее выполнения сразу возвращать value
.
Приняв все замечания, функцию можно изменить так:
const deepMap = (obj) => {
if (!obj.children) return obj.value; // если нет детей - сразу вернуть value
var maxChildren = obj.children.map(deepMap); // получаем максимальных из детей
return Math.max(obj.value, ...maxChildren); // возвращаем максимальное из значений.
};
Если убрать локальные переменные и if
можно получить следующий вариант:
function deepMax(obj){
return Math.max(obj.value, ...(obj.children||[]).map(deepMax));
}
Пример:
const deepMap = (obj) => {
if (!obj.children) return obj.value; // если нет детей - сразу вернуть value
var maxChildren = obj.children.map(deepMap); // получаем максимальных из детей
return Math.max(obj.value, ...maxChildren); // возвращаем максимальное из значений.
};
var graph = {
value: 75,
children: [{
value: 18,
children: [{
value: 35,
children: [{
value: 35,
children: [{
value: 66,
children: [{
value: 29,
children: [{
value: 85
}]
}]
}]
}]
}]
}]
}
console.log(deepMap(graph));
Для данной структуры я бы предложил такое решение:
const graph = {
value: 75,
children: [{
value: 18,
children: [{
value: 35,
children: [{
value: 35,
children: [{
value: 66,
children: [{
value: 29,
children: [{value: 85}]
}]
}]
}]
}]
}]
}
// Функция deepMap рекурсивно обходит дерево obj
// Второй параметр func - необходимая функция сравнения
function deepMap(obj, func){
if(obj.children){ // Если есть потомки - то уходим в рекурсию
let res = obj.value;
// Рекурсивно проходим по всем потомкам и вычисляем результат
for(let i = 0; i < obj.children.length; i++) {
res = func(res, deepMap(obj.children[i], func));
}
return res;
} else { // Нет потомков - возвращаем значение
return obj.value
}
}
console.log(`Max result for graph is: ${deepMap(graph, Math.max)}`);
console.log(`Min result for graph is: ${deepMap(graph, Math.min)}`);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
ЗдравствуйтеЕсть одномерный массив объектов в которых хранится информация о баннерных изображениях на сайте