2016-04-29 74 views
0

我有對象的數組。我想如果我添加對象的數組它應該以排序的方式添加。我使用數組排序,但它不排序我的數組。這裏是我的代碼爲什麼array.sort不能在JavaScript中工作?

https://jsfiddle.net/8oczc5x5/

var arr = [{ 
    elem: { 
    text: function() { 
     return "aa"; 
    } 
    } 
}, { 
    elem: { 
    text: function() { 
     return "yy"; 
    } 
    } 
}]; 
var obj = { 
    elem: { 
    text: function() { 
     return "bb"; 
    } 
    } 
} 
arr.push(obj); 
arr.sort() 
console.log(arr[1].elem.text()) 

有望走出放

"bb" 

實際輸出

"yy" 

..why?我用排序它應該排序我的數組?

+0

JavaScript無法對對象數組進行排序,因爲默認情況下,對象集不是按組名排列的。 – hubert

+0

如果您只用數字(1,2,3)嘗試,它工作正常。 – hubert

+0

好吧,所以我們如何對這個數組進行排序 – user944513

回答

3

sort只有在按字母順序對字符數據進行排序時,才能真正起到「開箱即用」的作用。你爲什麼期望它調用你的函數並比較它們?這非常危險和複雜。但是,您可以通過傳遞一個函數來執行自己的特殊排序。

從文檔兩者(compareFunction是要傳遞的功能):

如果compareFunction被提供時,所述陣列元件根據比較函數的返回值來分類的。如果a和b是被比較的兩個元素,則:

如果compareFunction(a, b)小於0,則將a排序爲比b更低的索引,即先到達。

如果compareFunction(a, b)返回0,則使a和b相對於彼此保持不變,但相對於所有不同的元素進行排序。注意:ECMAscript標準並不保證這種行爲,因此並非所有瀏覽器(例如,至少可以追溯到2003年的Mozilla版本)都尊重這一點。

如果compareFunction(a, b)大於0,則將b排序爲比a更低的索引。 compareFunction(a, b)當給定一對特定元素a和b作爲其兩個參數時,必須始終返回相同的值。如果返回不一致的結果,那麼排序順序是未定義的。

arr.sort(function(a, b) { 
    // localeCompare does a string comparison that returns -1, 0, or 1 
    return a.elem.text().localeCompare(b.elem.text()); 
}); 
+0

's/localCompare/localeCompare' – Hamms

+0

請分享小提琴 – user944513

+1

@ user944513爲什麼?你可以從字面上刪除這個來代替當前的'arr.sort()'調用。 –

0

您必須指定如何排序

arr.sort(function(a,b){ 
    a=a.elem.text(); 
    b=b.elem.text(); 
    return a > b ? 1 : (a < b ? -1 : 0); 
}) 
0

功能sortNumber(NUM1,NUM2){返回NUM1 - NUM2;}變種麻木= [5,17,29,48,4 ,21]; var sortnumb = numbs.sort(sortNumber); alert(sortnumb)

+0

歡迎使用StackOverflow:如果您發佈代碼,XML或數據示例,請在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕({})或使用鍵盤上的Ctrl + K格式和語法突出顯示它! – WhatsThePoint

+0

儘管此代碼片段可能會解決問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! –

相關問題