2012-12-29 35 views
2

複製Excel的JS排序的最佳方法是什麼?複製Excel的「排序方式」,然後按「行爲

比方說,我有一個元素的數組:

[6,0.75] 
[6,0.81] 
[9,0.75] 
[4,0.20] 

通過第一個關鍵排序他們是很容易,但如何複製「然後按」排序? Excel中會吐出用1鍵遞減和第二關鍵遞減以下結果:

[9,0.75] 
[6,0.81] 
[6,0.75] 
[4,0.20] 
+0

當對「2D-array」進行排序時,您也會得到與原生JS'Array.sort'方法相同的結果。如果在第一個索引處它滿足兩個相等的值,那麼'sort'將更深入內部數組。我想你可以通過代表一個4x4的數組來改善你的問題,然後按照3,0,2,1的順序排序。 – Teemu

回答

2

對於給定的例子,有這樣做的更簡單的方法,但在一般情況下,您可以將函數傳遞給sort方法,該方法將按指定順序比較每對值。 (jsfiddle

var arr1 = [[6, 0.75], [6, 0.81], [9, 0.75], [4, 0.20]], 
    arr2 = [[6, 0.75], [6, 0.81], [9, 0.75], [4, 0.20]], 
people = [{name: 'Jim', age: 40}, {name: 'Sally', age: 35}, 
      {name: 'Tim', age: 20}, {name: 'Jim', age: 72}]; 

function orderedComparison(indices) { 
    return function(a, b) { 
     for (var i = 0; i < indices.length; i++) { 
      if (a[indices[i]] > b[indices[i]]) return 1; 
      if (a[indices[i]] < b[indices[i]]) return -1; 
      // (if a == b, check next index) 
     } 
    } 
} 
// sort by first item in each pair, then 2nd 
arr1.sort(orderedComparison([0, 1])); 
console.log(arr1); 
// sort by 2nd item then 1st 
arr2.sort(orderedComparison([1, 0])); 
console.log(arr2); 
people.sort(orderedComparison(['name', 'age'])); 
console.log(people);​ 

注意,下面的,它只是排序由低優先級的鍵第一個那麼高優先級的關鍵,可能會工作,但爲not guaranteed to

arr1.sort(function(a, b) {return a[1] - b[1]}); 
arr1.sort(function(a, b) {return a[0] - b[0]}); 
+0

我認爲這和Excel的「按......排序」完全一樣。 +1:)。 – Teemu

+0

@Teemu或多或少,但如果你在同一個字段中同時包含文本和數字,那麼行爲將與Excel不同(它將任何文本看作<任意數字) – Stuart

+0

Yep,JS使用ASCII順序,但很容易更改該功能,需要時。感謝你,我打算使用它:)。 – Teemu

0

您可以通過縮放各分類指數複製這一功能,因此它們的大小不重疊並做使用Array.sort();

這是一個標準比較jsfiddle演示它:http://jsfiddle.net/Jd2ne/2/

提示:如果你不知道什麼大小是10的指數,當你用科學記數法寫出數字。 I.e:6 = 6 * 10^0 => 6的大小爲零。

+1

我認爲這隻適用於數字嗎? – Teemu

+0

是的,這是正確的。如果您希望此方法使用非數字輸入,則必須將輸入轉換爲數字,但無論如何,這就是常規排序的工作方式,唯一不同的是,您必須在此處指定數值以代表不同的輸入。 –

0

它應該是相當直截了當:

var array = [ 
[6, 0.75], 
[6, 0.81], 
[9, 0.75], 
[4, 0.20] 
]; 
array.sort(function (a, b) { 
    // if first columns are same then check second column 
    // else first column  
    return a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]; 
}); 
// [4,0.20] 
// [6,0.75] 
// [6,0.81] 
// [9,0.75] 

降序,採用B - 一個代替 - B。

相關問題