2010-05-21 81 views
0

我在排序包含未定義元素(稀疏數組)的數組時遇到問題。當然,這在Safari和Firefox中很有用,我還沒有嘗試過其他版本的IE,但這裏有一個簡單的例子。如何在IE7中使用未定義元素對數組進行排序JavaScript

<html> 
<head> 
<script type="text/javascript"> 
function runscript() { 
    var myArray = [{id: 2}, 
         undefined, 
         {id: 0}, 
         {id: 1}, 
         {id: 3}, 
         {id: 4}, 
         {id: 5}]; 
    myArray.sort(function compare(a, b) { return a.id - b.id; }); 
    var output = ''; 
    for (loop in myArray) { 
     output += myArray[loop].id + ' '; 
    } 
    alert(output); 
} 
</script> 
</head> 
<body onLoad="runscript();"> 
</body> 

警報()結尾莫名其妙地表示0 2 3 4 5 1從陣列正確排序,以及警報顯示0 1 2 3 4 5

是卸下未定義元件有一種在IE7中解決這個問題的方法,以便我可以可靠地對包含未定義元素的數組進行排序?只要所定義的元素排序正確,我不關心未定義的元素在哪裏結束。

回答

1

嘗試for (loop in myArray)for (var loop=0; loop<myArray.length; loop++)變化:

function runscript() { 
    var myArray = [{id: 2}, 
         undefined, 
         {id: 0}, 
         {id: 1}, 
         {id: 3}, 
         {id: 4}, 
         {id: 5}]; 
    myArray.sort(function compare(a, b) { return a.id - b.id; }); 
    var output = ''; 
    for (var loop=0; loop<myArray.length; loop++) { 
     output += (myArray[loop]||{id: 'undefined'}).id + ' '; 
    } 
    alert(output); 
} 
runscript() 

在使用這些項目不能保證順序排列在for (x in object)之間。另請參見Why is using "for...in" with array iteration a bad idea?

(以上提示0 1 2 3 4 5 undefined

編輯:未刪除 - 我測試過上面的和它的作品:-P

+0

我假設對於(在myArray中的循環)將尊重排序後的自然數組排序,事實上它似乎在Safari,Firefox甚至IE7(但只有當沒有未定義的值數組)。如果我按照David的建議做了索引循環,它可以在所有瀏覽器中使用。太糟糕了,我剛開始習慣更緊湊的循環語法。謝謝你的幫助。 – 2010-05-21 20:15:30

0

首先,您的排序函數是錯誤的,因爲它預計返回-1,0或+1,而不是布爾值。
使用這個代替

var arr = [.....] 
arr.sort((function(a, b){ 
    if (!a || !b) { 
     // Here you choose how to treat undefined/null elements 
     return 0; 
    } 
    return (a[index].id === b[index].id ? 0 : (a[index].id < b[index].id ? -1 : 1)); 
}) 

但只是讓你知道,你的這個循環會試圖從不確定的元素返回id屬性時拋出一個錯誤。此外,你不應該使用一個for..in循環遍歷數組,使用一個循環以遞增的索引或反向而這樣

var l = arr.length; 
while (l--) { 
    .. 
} 
1

也許你可以修改你的比較

myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; }); 
+0

你好,庫納爾,這似乎工作,但我不知道爲什麼。你能稍微解釋一下比較器功能嗎? – 2010-05-21 07:41:11

+0

是的。用於排序的自定義比較器假設返回整數值(僅限+ ve,-ve或0)。在上面的場景中,當值(a.id)未定義時,排序函數返回NaN,這是不正確的。 – Kunal 2010-05-21 08:06:43

+0

@David, 如果您嘗試比較 (如果(a.id == 10){//做些什麼)的值,它會拋出異常。 } – Kunal 2010-05-21 08:59:53

相關問題