查找字符串中所有单词实例的位置,在控制台中获得不必要的重复

时间:2014-12-09 16:45:29

标签: javascript str-replace

所以我试图创建一个简单的函数,在任何给定字符串中查找单词的所有实例的位置,而不使用for循环,正则表达式或将字符串转换为数组,尽管我感兴趣也看到了这些解决方案。

代码:

function wordFinder(word, text) {
   var findStart = text.search(word);
   var total = findStart  + ' to ' + (findStart += word.length);
   console.log(total);  
   text = text.replace(word[0], ' '); 
     if(text.search(word) == -1) { 
       console.log("all done");
       } else { 
              return wordFinder(word, text);
        }
};

wordFinder("hello", "hijellohellohello");

我希望控制台显示

"7 to 12"
"12 to 17"
"all done"

但我得到了

"7 to 12"
"7 to 12"
"12 to 17"
"all done"

玩了一些,很明显,如果一个匹配单词[0]的字符在之前出现这个单词会导致console.log(总计)为每个匹配触发一次,但是我我不确定为什么会这样做。

编辑:解释是有道理的,这是我的丑陋解决方案,使用for循环并创建一个未定义的可疑情况,但它的工作原理!如果有人想告诉我如何在真实环境中实际完成,那将不胜感激。

    function wordFinder(word, text) {
    var findStart = text.search(word);
    var total = findStart  + ' to ' + (findStart += word.length); 

var holder = [];
var spacer = " ";
  console.log(total); 
for(i=0; i + 1 < word.length; i++) {
  holder.push(spacer[i]);
      if(holder[i] === undefined) {
      holder[i] = spacer;
      }
} 
  text = text.replace(word, holder);
       if(text.search(word) == -1) { 
        console.log("all done");
       } else {
    return wordFinder(word, text);
     }
}
wordFinder("abc", "abaabczabcabc");

返回

"3 to 6"
"7 to 10"
"10 to 13"
"all done"

1 个答案:

答案 0 :(得分:0)

这是因为您正在接受第一个字母并将其替换为空格。因此,您的起始文本是第一次hijellohellohello,第二次是ijellohellohello,这意味着您的第一个hello实例仍在同一位置。因此,当您第二次运行递归时,您会得到相同的结果。

编辑:为了进一步澄清,文本的开头以&#34; h&#34;开头。如果word以&#34; h&#34;开头并且你word[0]等于&#34; h&#34;。你说的是替换&#34; h&#34;的第一个实例。有空间。因此它打印出&#34; 7到12&#34;,替换,再打印出来,然后再做一次替换,然后找到&#34;你好&#34;

的最后一个实例