2011-04-05 71 views
1

那天我問了一個關於在JQuery中根據附加數據值排序元素的問題。下面的解決方案工作,但提出了另一個關於使用本地排序方法的問題和它的效率。有沒有一種比JQuery更有效的排序方法?

任何人都可以推薦一種更有效的方法來解決這個問題嗎?

$(function() { 
    var myArray = $('li').get(); 

    myArray.sort(function(x,y) { 
     return $(x).data('color') > $(y).data('color') ? 1 : -1; 
    }); 

    $('ul').empty().append(myArray); 
}); 
+0

我無法想象你會比這更好,儘管你可能能夠避免一些DOM操作。 – 2011-04-05 12:34:11

+0

不確定它是否與效率有關,但是語句'return $(x).data('color')> $(y).data('color')?假設值爲數字,則可將1:-1'寫爲返回$(x).data('color') - $(y).data('color')'。 – zindel 2011-04-05 12:35:00

+0

值在此時刻是基於字符串的 – Andrew 2011-04-05 12:36:01

回答

4

所以你執行一個jQuery選擇......然後讓DOM元素的基礎數組...然後在排序每做比較,你是一個)創建的每一個新的jQuery元素兩個底層DOM元素,以及b)從它們獲取數據屬性。

這看起來似乎不太快,只是看着它。我反而建議:

1)創建地圖顏色DOM元素:

var lis = document.getElementsByTagName("li"); 

var keys = []; 
var map = {}; 
for (var i = 0, li; li = lis[i]; i) { 
    var color = $(li).data("color"); 
    keys.push(color); 
    map[color] = li; 
} 

2)排序的keys數組:

keys.sort(); 

3)創建DOM元素的陣列,以插入:

var lisInOrder = []; 
for (var j = 0, key; key = keys[j]; ++j) { 
    var liFromKey = keys[key]; 
    lisInOrder.push(liFromKey); 
} 

4)插入其中:

$('ul').empty().append(lis); 
0

據我所知實現的.sort()方法是不能跨越不同的實現標準化,但大多數會使用快速排序,這是相當快於大多數情況。然而,如果你有一個常量(和小)的顏色數量和大量的數據進行排序,有更快的算法(例如heapsort O(n * m)與快速排序O(n * logn))。另一方面,你將不得不在JavaScript中實現你的算法,但本地.sort()方法很可能是在環境的本地代碼中實現的。 所以最後我會堅持原生.sort()。

PS: 如果元素相等,比較函數應返回0。你的回報只有1和-1,這可能會影響結果和表現。

相關問題