js рекурсивная функция с for.. in циклом
В общем есть рекурсивная функция, ей передаётся объект и текстовый шаблон, функция должна вернуть свойства объекта и всех своих объектов если в их значении содержится текстовый шаблон.
<html> <head> <meta charset="utf-8"> <title>Test html with js tasks</title> <script type="text/javascript" src='./2.js'></script> </head> <body> <script type="text/javascript"> var objSample = { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }; findProperty(objSample, 'SGML'); </script> Pikabu </body> </html> и сама функция: function findProperty(obj, propContentPart) { for (var key in obj) { var value = obj[key]; if (typeof value === 'object') { if (findProperty(value, propContentPart)) { console.log(key); return true; } } else { if (value.indexOf(propContentPart) > -1){ console.log(key); return true; } } } } Получается следующий вывод: ID GlossEntry GlossList GlossDiv glossary Это цепочка(путь) до свойства, которое будет удовлетворять шаблону ( по-хорошему должно быть glossary->GlossDiv->GlossList->GlossEntry->Id). Проблема в том, что кроме него должны быть ещё свойства SortAs и Acronym со своими путями. Похоже на то, что когда в стеке рекурсии появляется первый return, то по достижении изначального for in он сразу выходит из него. Понятно что он должен выходить из того уровня рекурсии, в котором он появился. Вопрос: почему он не продолжает идти по следующим свойствам? |
Все дело в 7 строке. После того, как свойство с нужным значением найдено, функция заканчивается.
|
Вопрос: почему так? Если return происходит на одном из уровней функции, почему он просто не переходит на следующую итерацию предыдущего уровня рекурсии?
|
Цитата:
Возвращаться-то он возвращается... А вот продолжения перебора свойств прекращается. |
Цитата:
var objSample = { "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }; findProperty(objSample, 'SGML'); function findProperty(obj, propContentPart, History) { History=(History)? History: ''; var val; for (var key in obj) { var value = obj[key]; if (typeof value === 'object') { val=(History=='')? key: History+'->'+key; findProperty(value, propContentPart, val); } else { if (value.indexOf(propContentPart) > -1){ val=(History=='')? key: History+'->'+key; alert(val); }; }; }; }; |
ksa, спасибо. Только мне не понятно почему он прекращается. Извините, если кажусь тугодумом, но постараюсь объяснить как я это понимаю:
1. Начинаем перебирать свойства из цикла. 2. Заходим в эту же функцию, появляется новый уровень рекурсии. 3. Начинаем перебирать свойства из цикла. 4. Заходим в эту же функцию, появляется новый уровень рекурсии. итд... n. Попадаем на return. Выходим из функции на n'ом уровне рекурсии. Попадаем на предыдущий уровень и продолжаем перебирать функции из него. Почему он сразу выходит из всех уровней? ksa, Вы говорите, что всё дело в расположении return, что не так с ним? |
Цитата:
Перебор прекратиться если найдено свойство с нужным содержанием... Там ведь ретурн стоит. |
Часовой пояс GMT +3, время: 01:04. |