Поможете с рекурсивной функцией? Здравствуйте! Вот столкнулся с такой задачей. Есть 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-вложенности.
Проблема в вашем коде заключается в том, что вы вызываете функцию 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.
Проблема в вашем коде заключается в том, что вы вызываете функцию 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.