2016-04-27 2 views
0

У меня есть этот код JavaScript, где функция rec() вызывается сама по себе. Целью этого кода является цикл через HTML-подобный текст и замена всех вхождений регулярного выражения «IMG (. *) Tid».Рекурсия JavaScript возвращает промежуточные результаты, а не конечный результат

После того, как он обработал строку, он должен вывести окончательную версию строки в переменной «newText» (в строке 5).

var text = '<IMG tid="302293901" title="test"><P></P><IMG tid="302293901" title="test">'; 
 
alert("source text: " + text); 
 

 
var newText = rec(text); 
 
alert("final source text: " + newText); 
 

 
function rec(str) { 
 
    var i = str.search("IMG(.*)tid"); 
 
    alert("value of i: " + i); 
 
    if (i > -1) { 
 
    str = str.replace("IMG", "BLA"); 
 
    alert("modified source text: " + str); 
 
    rec(str); 
 
    } 
 
    return str; 
 
}

Если этот код работает это не изменить строку источника в «текст» переменной, заменив все вхождения «IMG» с «BLA». Во время его выполнения функция отображает ожидаемую финальную строку, которая выглядит, как показано ниже.

expected final results

Однако проблема состоит в том, что окно предупреждения в строке 5 не возвращает результаты, показанные выше, но результат посредник (где только один из «IMG» записи были заменены).

Возвращенная строка показана ниже.

actual final results

Так что этот код, вероятно, неправильно структурирована, но каким образом?

+1

Я не знаю, если вы изучаете рекурсию или что-то подобное, но: вы знаете, вы можете решить эту проблему с помощью RegExp? – MarcoS

+3

Почему вы не возвращаете результат рекурсивного вызова? Т.е. 'return rec (str)' –

+0

спасибо @MarcoS, да в этом случае я просто хотел понять, почему эта рекурсия ведет себя так. – x457812

ответ

4

Когда вы запускаете rec снова изнутри rec, вы ничего не делаете с возвращенным результатом. Вы должны изменить его str = rec(str)

+0

aargh duh yes u r правильный. Это было довольно глупо. Спасибо, что указали. – x457812

1

Вы должны вернуть значение rec ...

function rec(str) { 
    var i = str.search("IMG(.*)tid"); 
    alert("value of i: " + i); 
    if (i > -1) { 
    str = str.replace("IMG", "BLA"); 
    alert("modified source text: " + str); 
    return rec(str); 
    } 
    return str; 
} 
Смежные вопросы