2012-10-19 23 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"); 
    }