2013-10-04 17 views
1

我正在做家庭作業。這是我的問題和嘗試解決方案。如何顯示字符串中每個char charrence的位置?

顯示字符 「e」 的字符串中的每次出現的位置 「tx_val」

tx_val="the quick brown fox jumped over the lazy dogs back"; 

    os=' '; //output string 
    eloc=' '; 

    for (i=0; i<tx_val.lastIndexOf('e');i++) 
    { 
    if(tx_val.indexOf('e')!= -1) 
     { 

      eloc=tx_val.indexOf('e') ; 
      os=os+eloc; 
      i++; 
     } 

     }   

我預期的結果:2 24 29 34

我的結果:2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

我不是在尋找答案,而是爲了解釋爲什麼我的邏輯不起作用,並指出我是正確的方向。

+5

使用的indexOf的第二個參數。 –

+2

'indexOf('e')'將*總是*給你'e'的* first *索引。使用[第二個參數](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)指定從哪裏開始搜索。話雖如此,我不會解決這個問題。 –

+2

爲什麼你在循環內增加'i'? – j08691

回答

2

一個更好的解決方案可能是這樣的:

var lastIndex = tx_val.indexOf('e'); 
while (lastIndex > -1) { 
    os += lastIndex + " "; 
    lastIndex = tx_val.indexOf('e',lastIndex + 1); 
} 
+0

打敗我吧。 :) – talemyn

+0

這完美的作品。如果你不介意我問。你是如何確定使用while循環的?這只是你多年的經驗後學到的嗎? –

+0

從技術上講,任何'for'循環都可以重寫爲'while'循環,反之亦然。一個'while'循環感覺像是一個更自然的適合我們在這裏要做的事情,因爲你想循環*而某些條件仍然是真的(仍然有'e'匹配)。你可以寫一些像'for(var lastIndex = tx_val。的indexOf( 'E'); lastIndex> -1; lastIndex = tx.val.indexOf('e',lastIndex + 1))'它應該是一樣的。但我個人不喜歡'for'循環,這些循環在每個循環上做的不僅僅是簡單的加法或減法。因人而異。 –

4

當在同一個字符串上使用單個參數調用時,indexOf()每次都會一直返回相同的索引。

indexOf()的第一個參數是要匹配的子字符串。第二個可選參數是開始搜索表單的索引。除非你傳遞這個參數,否則結果在每次迭代之間都不會改變。

假設循環的i迭代器值等於lastIndexOf()值也是不正確的。這隻會使循環運行許多冗餘迭代,因爲匹配的數量當然不等於匹配索引的值(除非字符串僅由e字符組成)。換句話說,如果您在索引24中只有一個匹配項,則該循環仍會無緣無故地重複23次。

+0

感謝您的答覆/評論。我修改了我的代碼並獲得了indexOf()的第2,3,4等參數。您關於冗餘循環迭代的觀點是現成的。我該如何確定如何定義我的for循環的第二個參數來循環所需的次數? –

+0

沒問題。 @MattBurland確實是這種情況下的正確解決方案。 – Boaz

0

如果您嘗試將字符串分割成個體字符數組,你分析它,並匹配索引存儲在另一個(輸出)陣列?

1

其他人已經提供瞭解決方案(第二個參數indexOf)。

我就離開這條線在這裏

tx_val.replace(/e/g, function(str, i) {os = os + ' ' + i}); 
相關問題