Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.06.2019, 13:18
Новичок на форуме
Отправить личное сообщение для iBoolat Посмотреть профиль Найти все сообщения от iBoolat
 
Регистрация: 23.06.2019
Сообщений: 6

Рекурсивный вывод свойств объекта.
Кто-нибудь шарит ООП?
Начал изучать на 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:29.
Ответить с цитированием
  #2 (permalink)  
Старый 23.06.2019, 13:30
Новичок на форуме
Отправить личное сообщение для iBoolat Посмотреть профиль Найти все сообщения от iBoolat
 
Регистрация: 23.06.2019
Сообщений: 6

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

'object'
'a'
'b'
'c'
'i'
'l'
'm'
'v'
'w'
'x'
Ответить с цитированием
  #3 (permalink)  
Старый 23.06.2019, 13:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

iBoolat,
строка 38!!! что проверяется?
Ответить с цитированием
  #4 (permalink)  
Старый 23.06.2019, 13:48
Новичок на форуме
Отправить личное сообщение для iBoolat Посмотреть профиль Найти все сообщения от iBoolat
 
Регистрация: 23.06.2019
Сообщений: 6

Даааааа, я только что уже решил проблему
Не учел, что объект - это ассоциированный массив. Спасибо!
Ответить с цитированием
  #5 (permalink)  
Старый 23.06.2019, 13:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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);
Ответить с цитированием
  #6 (permalink)  
Старый 23.06.2019, 13:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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);
Ответить с цитированием
  #7 (permalink)  
Старый 23.06.2019, 13:53
Новичок на форуме
Отправить личное сообщение для iBoolat Посмотреть профиль Найти все сообщения от iBoolat
 
Регистрация: 23.06.2019
Сообщений: 6

Ага... А я, кстати, иначе сделал. Просто везде вместо item записал obj[item] и сработало. Этот способ хуже или все такое же?
Ответить с цитированием
  #8 (permalink)  
Старый 23.06.2019, 13:53
Новичок на форуме
Отправить личное сообщение для iBoolat Посмотреть профиль Найти все сообщения от iBoolat
 
Регистрация: 23.06.2019
Сообщений: 6

Все, вопрос отпал! Спасибо огромное!!!
Ответить с цитированием
  #9 (permalink)  
Старый 23.06.2019, 13:56
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от iBoolat
Задача такая: надо перебрать все свойства объекта и вывести их в консоли.
А зачем? Посмотреть свойства можно просто console.log(obj).
Ответить с цитированием
  #10 (permalink)  
Старый 23.06.2019, 13:59
Новичок на форуме
Отправить личное сообщение для iBoolat Посмотреть профиль Найти все сообщения от iBoolat
 
Регистрация: 23.06.2019
Сообщений: 6

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция которая преобразовывает значения всех свойств объекта DarkPhoenix Общие вопросы Javascript 1 25.05.2019 00:38
Свойства объекта, взятые из свойств этого же объекта. nklf-367 Общие вопросы Javascript 2 17.10.2017 17:36
динамическое обновление свойств объекта в цикле grego Общие вопросы Javascript 3 04.12.2013 23:29
Выдать список всех свойств указанного при вводе объекта указанного фрейма flasher167 Общие вопросы Javascript 11 05.04.2013 08:14
Не работает перебор свойств объекта BANick Общие вопросы Javascript 1 16.09.2008 22:46