Попытка передать содержимое объектов, вложенных внутри объектов, в массив (JavaScript)

Когда объекты вложены внутри объектов, я не могу перебирать их с помощью обычного цикла for in. Я погуглил и обнаружил, что мне нужно создать рекурсивную функцию, которая будет проверять, является ли свойство объектом. Я написал рекурсивную функцию следующим образом: `

 function isObject(value){
        return (typeof(value)==='object');
      }

``

 function listToArray(list){
        let arr=[];
        for (let elem in list){
            if (isObject(list[elem])===false){
                console.info(list[elem]);
            }
            else if (isObject(list[elem])){
                listToArray(list[elem]);
            }
        }
        return arr;
       }

`

эта функция работает хорошо, она глубоко перебирает все объекты, вложенные в объекты, и console.info регистрирует все значения свойств. и возвращает пустой массив.

однако, когда я заменяю console.info(list[elem])) на arr.push(list[elem]), чтобы реальная функциональность работала, в первый больший объект помещаются только те свойства, которые не являются объектами.

Это проблема кодирования в книге Eloquent JavaScript. Мне не нужен ответ на эту проблему (на самом деле ответы есть в книге). Я просто хочу знать, почему console.info работает, а arr.push — нет. потому что мне это кажется таким странным, и я не могу найти этому объяснения.

Редактировать: например этот объект

let list = { value : 1,
             rest: { value:2,
                     rest:{value:3,
                           rest:null}
                    }
            }

listToArray(list) должен вернуться [1,2,3]

Можете ли вы описать свою проблему немного яснее? Вы хотите, чтобы все элементы, которые не являются объектами, были сгруппированы и помещены в массив?

Daniel Smith 25.11.2022 13:29

Я отредактировал свой пост и добавил пример, чтобы показать, что я имел в виду более четко

KarimMaged 25.11.2022 13:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что вы не фиксируете возвращаемый массив в своем блоке elseif

      function isObject(value){
        return (typeof(value)==='object');
      }
      
       function listToArray(list){
        let arr=[];  
        for (let elem in list){
            if (isObject(list[elem])===false){
                arr.push(list[elem]);
            }
            else if (isObject(list[elem])){
                retArr = listToArray(list[elem]);
                arr = [...arr, ...retArr];
            }
        }
        return arr;
       }

Да, теперь это кажется таким очевидным. Каждый раз, когда функция выполняет рекурсию, массив снова становится пустым из-за let arr=[] вверху. Но почему значение подталкивается к первому значению. разве `listToArray(list)' не должен возвращать [3] вместо [1]?

KarimMaged 25.11.2022 14:01

потому что первый вызов функции listToArray.. проверял два ключа value и rest. value(1) помещается в arr.., а для rest вы сделали рекурсивный вызов без возврата, поэтому, по сути, он игнорировал все, что произошло в этом и последующих рекурсивных вызовах. и как только весь рекурсивный стек выталкивается ... вы только что вернули arr, в котором есть только 1.

Marc Simon 25.11.2022 14:13

теперь все ясно. большое спасибо

KarimMaged 25.11.2022 14:19

Другие вопросы по теме