Рекурсивный вывод свойств объекта.
Кто-нибудь шарит ООП?
Начал изучать на 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:40. |