Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2018, 22:42
Новичок на форуме
Отправить личное сообщение для Epitough Посмотреть профиль Найти все сообщения от Epitough
 
Регистрация: 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(). Не могу понять как "копать" вглубь
Ответить с цитированием
  #2 (permalink)  
Старый 12.11.2018, 23:07
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Зачем там map или reduce - хз, а так - рекурсивно.)
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 12.11.2018, 23:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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>
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2018, 00:23
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 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>
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2018, 17:23
Новичок на форуме
Отправить личное сообщение для Epitough Посмотреть профиль Найти все сообщения от Epitough
 
Регистрация: 12.11.2018
Сообщений: 7

А что делает map без функции, но с аргументом. Или это, получается, рекурсия? foo не вызывается, а становится функцией callback для map? Правильно понимаю?
Ответить с цитированием
  #6 (permalink)  
Старый 13.11.2018, 17:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Epitough,
... обычный map с функцией ...
Ответить с цитированием
  #7 (permalink)  
Старый 13.11.2018, 17:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

Сообщение от 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>
Ответить с цитированием
  #8 (permalink)  
Старый 13.11.2018, 20:18
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 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()?
Ответить с цитированием
  #9 (permalink)  
Старый 13.11.2018, 20:35
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от Poznakomlus
циклом while можно заменить любую рекурсию
Прямо таки любую?
Ответить с цитированием
  #10 (permalink)  
Старый 13.11.2018, 20:59
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от 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()?
не сразу понял как тут без рекурсии обошлось )
этот цикл не заходит в чилды элементов, которые сами по себе не последние чилды.
чуть поменял данные, можно увидеть баг - минимум неверный
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать массив объектов в массив массивов sovsem-nub Events/DOM/Window 4 12.05.2018 21:56
ООП - перебор объектов и применение к ним метода wadim Общие вопросы Javascript 16 22.10.2017 01:51
перебор массива объектов phoenix200689 Общие вопросы Javascript 5 27.07.2017 09:42
Создание из 2 массивов массив объектов RoyalHunt Общие вопросы Javascript 7 17.01.2017 17:15
Перебор объектов DivMan Общие вопросы Javascript 15 07.09.2016 10:12