2016-04-27 127 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

你爲什麼不返回遞歸調用的結果?即'返回rec(str)' –

+0

謝謝@MarcoS,是的,在這種情況下,我只是想明白爲什麼這種遞歸行爲像這樣。 – x457812

回答

4

當您在rec內再次運行rec時,您不會對返回的結果做任何處理。您需要將其更改爲str = rec(str)

+0

aargh duh yes你是對的。那對我來說很愚蠢。謝謝你指出。 – 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; 
}