所以我试图创建一个简单的函数,在任何给定字符串中查找单词的所有实例的位置,而不使用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"
答案 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;