2012-10-19 35 views
0

我传递一个错误消息数组来解析。一个示例的输入将是:迭代字符串数组会产生错误

"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是一个空字符串?那就是我不应该提醒“错误!”这里。

+0

您应该检查aLines'的'长度,并确保它是因为在最后一行的末尾一个断行的不是4。 –

+0

'split'在这种情况下将返回4段。最后一段是一个空字符串('“”'),但不是'null'或'undefined'。如果它自己在一行上,你需要忽略最后一个'\ n'。 – Zabba

+0

问题已解决。每个答案都是正确的。谢谢。 –

回答

1

正如jbabey表示,采用for .. in循环的Javascript是有风险的,undeterministic(随机次序 - 有时)。您最常用的方法是通过关联数组中的对象进行解析。 但是,如果你坚持不让for .. in,包裹for内有if块像这样:

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] + "\""); 
} 
1

您应该对数组使用常规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/

0

你是最后得到Error!,因为分割会给你空行"",当你用if(!aLines[i])检查它时,它会返回true,因为它是空的/ null /无。你可以在fiddle这里检查它,你从结尾删除空行,并且它不会重复4次。

我也把在下面的代码显示警报:

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