在字符串中查找文本,将其存储在数组中并显示它

时间:2015-05-10 00:10:17

标签: javascript arrays for-loop indexof

我正在尝试在字符串内容中找到一个字符串,并在一个数组中逐个字母地推送找到的内容,并在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();
}

4 个答案:

答案 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变为-1i = text.indexOf("John", i + 1)从索引John中找到i + 1,并将其分配回i。因此,如果找不到Johni将为-1并且循环将会中断。

<强>演示

&#13;
&#13;
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;
&#13;
&#13;

  

在不使用正则表达式的情况下实现此类目标的最佳做法

for循环更适合任何可数循环。每当你想循环直到某个条件为真时,最好的选择是while循环。

&#13;
&#13;
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;
&#13;
&#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。我将永远小于我加上一些......