Поможете с рекурсивной функцией? Здравствуйте! Вот столкнулся с такой задачей. Есть JS объект n-вложенности. То есть внутри него кроме свойств, есть еще объекты, а в них в свою очередь есть еще объекты и так до n. Выглядит это как то так: var trunk = {
listItem1: 1,
listItem2: {
subListItem: 1,
subListItem2: {
subsubListItem1: 1,
subsubListItem2: 2
}
},
listItem3: 3
}
Нужно с этим объектом сделать следующее: выцепить из него все свойства, значения которых равны 1, и написать путь до них след. образом: ListItem2 > subListItem2 > subsubListItem1. То есть пройтись по всему объекту и его подобъектам. Написал такую функцию: function search(obj) {
for (var key in obj) {
if (obj[key] == "1") {
console.log(key + '>')
} else if (typeof obj[key] == "object") {
console.log(this + '>');
return search(this);
} else {
// "I dont need this"
}
}
};
То есть функция проверяет значения. Сначала на равенство единице, затем проверяет объект ли это, и если это ни то, ни другое - ничего не делает. Если это объект, мне необходимо зациклить функцию, чтоб она начала выполнять саму себя, и остановилась, когда ни объектов, ни единиц не осталось. Моя ошибка в том, что во время проверки на объект, она зацикливается до бесконечности с ошибкой "speechSythesis" и бесконечным алертом, или же "Maximum call stack size exceeded" в консоли (Chrome). В чем моя ошибка? Ответ хотелось бы подробный и с разъяснениями.
В идеале хотелось бы иметь функцию, которая (теоретически, тк практически компьютер вероятно зависнет) проверит объект с n количеством свойств n-вложенности.

21 Авг 2019 в 07:01
168 +1
0
Ответы
1

Проблема в вашем коде заключается в том, что вы вызываете функцию search() рекурсивно, передавая в нее this в качестве аргумента, вместо obj[key]. Кроме того, вы не обрабатываете случаи, когда значение свойства не равно 1.

Вот исправленный код:

function search(obj, path = '') {
for (var key in obj) {
if (obj[key] === 1) {
if (path === '') {
console.log(key);
} else {
console.log(path + ' > ' + key);
}
} else if (typeof obj[key] === "object") {
search(obj[key], key);
}
}
}
var trunk = {
listItem1: 1,
listItem2: {
subListItem: 1,
subListItem2: {
subsubListItem1: 1,
subsubListItem2: 2
}
},
listItem3: 3
};
search(trunk);

Этот код рекурсивно проходит по всем свойствам объекта и его подобъектов, выводя путь до свойства, значения которого равно 1.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир