Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Рекурсивный вывод свойств объекта. (https://javascript.ru/forum/misc/77802-rekursivnyjj-vyvod-svojjstv-obekta.html)

iBoolat 23.06.2019 13:18

Рекурсивный вывод свойств объекта.
 
Кто-нибудь шарит ООП?
Начал изучать на 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' как-то иначе закодирован, чем тот, который ждет компилятор? (прогаю на маке). Компилировал на плейкод и в контесте, по которому учусь. везде одна и та же проблема.

iBoolat 23.06.2019 13:30

вот вывод в консоль кстати:

'object'
'a'
'b'
'c'
'i'
'l'
'm'
'v'
'w'
'x'

рони 23.06.2019 13:36

iBoolat,
строка 38!!! что проверяется?

iBoolat 23.06.2019 13:48

Даааааа, я только что уже решил проблему :)
Не учел, что объект - это ассоциированный массив. Спасибо!

рони 23.06.2019 13:51

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);

рони 23.06.2019 13:53

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);

iBoolat 23.06.2019 13:53

Ага... А я, кстати, иначе сделал. Просто везде вместо item записал obj[item] и сработало. Этот способ хуже или все такое же?

iBoolat 23.06.2019 13:53

Все, вопрос отпал! Спасибо огромное!!!

iBoolat 23.06.2019 13:59

Ну тут в выводе ожидаются только названия свойств. как первоуровневых, так и вложенных. Я не знаю зачем)) Это же учебная задача. Видимо, нужна именно для того, чтобы я столкнулся с этой проблемой и поломал голову над ее решением.


Часовой пояс GMT +3, время: 21:09.