繁体   English   中英

遍历字符串数组会产生错误

[英]Iterating over array of strings produces error

我传入了一系列错误消息以进行解析。 输入示例为:

"An item with this x Id already exists.
 An item with this y id already exists.
 An item with this barcode already exists.
"

也就是说,字符串实际上是上面的每行之间用\\ n分隔,最后是\\ n。

function( msg )
{
  alert( "\"" + msg + "\"" );
  var aLines = msg.split( /\r?\n+/ );

  for ( var i in aLines )
  {
     if ( !aLines[i] ) { alert( "Error!" ); continue; }
     alert( i + ": \"" + aLines[i]  + "\"" );
  }
}

我将其分成几行,然后遍历所有行。 在索引3处没有行,并且第一个条件触发器。 那不是空行吗? 例如“”

然后,循环实际上将另一个元素移至4,并显示函数的内容。

那就是我得到的-五个警报:

0: "An item with this x Id already exists."
1: "An item with this y id already exists."
2: "An item with this barcode already exists."
Error!

最后一个是最奇怪的:

hasObject: "function(o) {
    var l = this.length + 1;
    ... more lines ...
}

我不明白这里发生了什么。 为什么要迭代一个以上的元素? 为什么最后一个元素是函数? 而且偏移量3不应为空字符串吗? 那就是我不应该警告“错误!” 这里。

正如jbabey所说,在Javascript中使用for .. in循环是冒险且不确定的(有时是随机顺序)。 您通常会使用它来解析关联数组中的对象。 但是,如果您坚持将for .. in保留在其中for使用if块将for的内部包裹起来,例如:

for (var i in aLines)
{
    if(aLines.hasOwnProperty(i))
    {
        // ... Do stuff here
    }
}

否则,只需将其更改为经典的增量for循环即可消除该错误:

for (var i = 0; i < aLines.length; i++)
{
   if ( !aLines[i] ) { alert( "Error!" ); continue; }
   alert( i + ": \"" + aLines[i]  + "\"" );
}

您应该对数组使用常规的for循环,因为for-in还将返回Array对象中的所有其他属性键。 这就是为什么您看到“ hasObject”的原因(在我的浏览器中,我看到的更多了):因为您的数组具有函数“ hasObject”,所以当您枚举Array的所有属性时就会出现。

正确的for循环:

  for ( var i = 0, ii = aLines.length; i<ii; i++ )
  {
    if ( !aLines[i] ) { alert( "Error!" ); continue; }
    alert( i + ": \"" + aLines[i]  + "\"" );
  }

这是将for-in循环替换为for循环的代码,它可以按预期工作:

http://jsfiddle.net/SamFent/4rzTh/

您遇到Error! 最后,因为拆分给您空行""并且当您使用if(!aLines[i])检查它时,它返回true因为它为空/空/无。 您可以点击此处查看在拨弄 ,您从末的空行,它不会随着阵列走4倍。

我还输入了以下显示警报的代码:

    var a="";
    if(!a){
        alert("!a");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM