我正在尝试在字符串内容中找到一个字符串,并在一个数组中逐个字母地推送找到的内容,并在html中显示所有找到的内容。但是for循环似乎有问题(不要运行它崩溃)。在不使用正则表达式的情况下实现这样的事情的最佳实践是什么。代码位于下方。
var text = "asdas John asd asda sdas dasd asd Jon asdas das dasdas dasdasdasda sadas John jsadjasd";
var hits = [];
var myName = "John";
for (var i = text.indexOf("John"); i < (i + myName.length); i++) {
hits.push(text[i]);
}
if (hits.length === 0) {
document.getElementById("result").innerHTML = "not found";
} else {
document.getElementById("result").innerHTML = hits.toString();
}
答案 0 :(得分:2)
实际问题
当添加到其他正数时,正数将始终小于相同数字。所以,
i < (i + myName.length)
将永远为真,因为i
具有正值6
,这是第一次出现John
的索引。所以,你的程序会遇到无限循环。
<强>解决方案强>
要解决此问题,您可以使用Array.prototype.indexOf
中的第二个参数,例如
for(var i = text.indexOf("John"); i !== -1; i = text.indexOf("John", i + 1))
现在,您的程序将会运行,直到i
变为-1
。 i = text.indexOf("John", i + 1)
从索引John
中找到i + 1
,并将其分配回i
。因此,如果找不到John
,i
将为-1
并且循环将会中断。
<强>演示强>
var text = "asdas John asd asda sdas dasd asd Jon asdas" +
" das dasdas dasdasdasda sadas John jsadjasd";
var hits = [];
var myName = "John";
for (var i = text.indexOf(myName); i !== -1; i = text.indexOf(myName, i + 1)) {
hits.push(i);
}
if (hits.length === 0) {
document.getElementById("result").innerHTML = "not found";
} else {
document.getElementById("result").innerHTML = hits.join("<br />");
}
&#13;
<pre id="result" />
&#13;
在不使用正则表达式的情况下实现此类目标的最佳做法
for
循环更适合任何可数循环。每当你想循环直到某个条件为真时,最好的选择是while
循环。
var text = "asdas John asd asda sdas dasd asd Jon asdas" +
" das dasdas dasdasdasda sadas John jsadjasd";
var hits = [];
var myName = "John";
var i = text.indexOf(myName);
while (i !== -1) {
hits.push(i);
// Find index of `myName` from the index `i + 1` and store it back it in `i`
i = text.indexOf(myName, i + 1);
}
if (hits.length === 0) {
document.getElementById("result").innerHTML = "not found";
} else {
document.getElementById("result").innerHTML = hits.join("<br />");
}
&#13;
<pre id="result" />
&#13;
现在,while
循环使逻辑更具可读性和清晰度。而且,你可以在循环中有足够的注释来解释逻辑,即使它有点难以理解: - )
答案 1 :(得分:0)
你主要在那里,我不确定我是否完全理解你正在尝试做什么,但你的for循环实际上并不是在不止一次地寻找文本。如果没有找到任何内容,加indexOf
将返回&lt; 0。
var text="asdas John asd asda sdas dasd asd Jon asdas das dasdas " +
"dasdasdasda sadas John jsadjasd";
var hits = [];
var myName = "John";
var find = text.indexOf(myName);
while (find >= 0) {
hits.push(text.substr(find, myName.length));
find = text.indexOf(myName, find + 1);
}
if (hits.length === 0) {
document.getElementById("result").innerHTML = "not found";
} else {
document.getElementById("result").innerHTML = hits.toString();
}
答案 2 :(得分:0)
尝试使用do while
循环
var text = "asdas John asd asda sdas dasd asd Jon asdas das dasdas "
+ "dasdasdasda sadas John jsadjasd";
var hits = [];
var myName = "John";
var len = myName.length;
var i = text.indexOf(myName);
var result = document.getElementById("result");
do {
// push letters of `myName`
hits.push(text[i]);
// increment `i`
++i;
} while(hits.length < len);
if (hits.length === 0) {
result.innerHTML = "not found";
} else {
result.innerHTML = hits.toString();
}
<div id="result"></div>
答案 3 :(得分:-3)
for循环中的条件始终为true。我将永远小于我加上一些......