Рекурсивный вывод свойств объекта.
Кто-нибудь шарит ООП?
Начал изучать на JS, но столкнулся со следующей проблемой: Задача такая: надо перебрать все свойства объекта и вывести их в консоли. Причем вложенные свойства тоже надо выводить. Решил сделать это с помощью рекурсивной функции, но внутри функции саму себя вывести не могу. Вроде бы по коду все правильно, он даже компилируется. Сравнивал с другими примерами рекурсивных функций - все логично. Вот мой код: var obj = { // тут тупо задаю какой-то объект, не стоит особо вчитываться. a: 3, b: 2, c: { d: 1, e: 2, f: { g: 1, h: 2 } }, i: { j: 1, k: 1 }, l: 1, m: { n: 1, o: 2, p: 3, r: { s: 1, t: 2 }, u:1 }, v:1, w:1, x: { y:{ z:1 } } } function recursion(obj) { // вот тут уже пошла сама функция, в ней и проблема. for (let item in obj) { if (typeof item === 'object') { console.log('Here is an object!'); // если я вошел в тело условного оператора, то увижу это по выводу консоли. но в консоли ничего не выводится :( recursion(item); } else { console.log(item); } } } console.log(typeof obj.c) //тут решил проверить, вообще является ли свойство c вложенным объектом. является. В консоль выводит recursion(obj); Вывод программы - только свойства первого уровня. Свойства вложенных объектов не выводятся. В принципе вся ситуация достаточно простая, но я не захожу в тело первого условного оператора, когда проверяю объект(специально включил в код вывод в консоль, чтобы проверять этот факт). При чем как вы можете видеть, я перед вызовом функции специально сделал вывод типа вложенного объекта, и он выводит 'object'. Но в иф не входит :( Может проблема кодировки? может, набранный мной в коде стринг 'object' как-то иначе закодирован, чем тот, который ждет компилятор? (прогаю на маке). Компилировал на плейкод и в контесте, по которому учусь. везде одна и та же проблема. |
вот вывод в консоль кстати:
'object' 'a' 'b' 'c' 'i' 'l' 'm' 'v' 'w' 'x' |
iBoolat,
строка 38!!! что проверяется? |
Даааааа, я только что уже решил проблему :)
Не учел, что объект - это ассоциированный массив. Спасибо! |
iBoolat,
var obj = { a: 3, b: 2, c: { d: 1, e: 2, f: { g: 1, h: 2 } }, i: { j: 1, k: 1 }, l: 1, m: { n: 1, o: 2, p: 3, r: { s: 1, t: 2 }, u: 1 }, v: 1, w: 1, x: { y: { z: 1 } } }; function recursion(obj) { for (var item of Object.values(obj)) if (typeof item === "object") { console.log("Here is an object!"); recursion(item) } else console.log(item) } console.log(typeof obj.c); recursion(obj); |
iBoolat,
или obj[item] var obj = { a: 3, b: 2, c: { d: 1, e: 2, f: { g: 1, h: 2 } }, i: { j: 1, k: 1 }, l: 1, m: { n: 1, o: 2, p: 3, r: { s: 1, t: 2 }, u: 1 }, v: 1, w: 1, x: { y: { z: 1 } } }; function recursion(obj) { for (var item in obj) if (typeof obj[item] === "object") { console.log("Here is an object!"); recursion(obj[item]) } else console.log(obj[item]) } console.log(typeof obj.c); recursion(obj); |
Ага... А я, кстати, иначе сделал. Просто везде вместо item записал obj[item] и сработало. Этот способ хуже или все такое же?
|
Все, вопрос отпал! Спасибо огромное!!!
|
Ну тут в выводе ожидаются только названия свойств. как первоуровневых, так и вложенных. Я не знаю зачем)) Это же учебная задача. Видимо, нужна именно для того, чтобы я столкнулся с этой проблемой и поломал голову над ее решением.
|
Часовой пояс GMT +3, время: 21:09. |