【问题标题】:Finding text in string, storing it on array and displaying it在字符串中查找文本,将其存储在数组中并显示它
【发布时间】:2015-05-10 00:10:17
【问题描述】:

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

【问题讨论】:

  • for 比较是错误的:i
  • 如果anything >=0,i &lt; (i + anything) 将始终评估为真,并且由于字符串的长度满足该条件,这会产生无限循环。只使用i &lt; myName.length

标签: javascript arrays for-loop indexof


【解决方案1】:

实际问题

一个正数与其他正数相加时,总是小于同一个数。所以,

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) 从索引i + 1 中找到John 并将其分配回i。因此,如果找不到更多的Johns,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 />");
}
&lt;pre id="result" /&gt;

在不使用正则表达式的情况下实现这样的目标的最佳做法是什么

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 />");
}
&lt;pre id="result" /&gt;

现在,while 循环使逻辑更具可读性和清晰性。此外,你可以在循环内有足够多的 cmets 来解释逻辑,即使它有点难以理解:-)

【讨论】:

  • 很好的答案,尽管您选择 while over for 纯粹是个人审美。在这种情况下,我碰巧更喜欢 for 循环,无论是概念上还是外观上。
【解决方案2】:

您大部分时间都在那里,我不确定我是否完全理解您要做什么,但您的 for 循环实际上并没有多次查找文本。加上indexOf 将返回

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(); 
}

【讨论】:

    【解决方案3】:

    尝试使用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(); 
    }
    &lt;div id="result"&gt;&lt;/div&gt;

    【讨论】:

      【解决方案4】:

      for 循环中的条件将始终为真。 i 永远比 i 小一些……

      【讨论】:

        猜你喜欢
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多