2013-02-28 80 views
141

我目前使用underscorejs來排序我的json排序。現在我要求使用underscore.js進行排序ascendingdescending。在文檔中我沒有看到任何相同的內容。我怎樣才能做到這一點?我如何使用underscore.js做一個asc和desc排序?

+1

請添加您正在排序和如何排序的示例。 – Jon 2013-02-28 14:30:22

+0

你在排序?數字?字符串?日期?還有別的嗎? – 2013-02-28 19:00:11

+0

@ muistooshort我正在排序一個對象數組。所以sortBy方法完全適合我的標準,而不是相反。 – Rahul 2013-03-01 04:49:01

回答

318

您可以使用.sortBy,它總是會返回一個上升列表:

_.sortBy([2, 3, 1], function(num) { 
    return num; 
}); // [1, 2, 3] 

但是你可以使用.reverse方法得到它

var array = _.sortBy([2, 3, 1], function(num) { 
    return num; 
}); 

console.log(array); // [1, 2, 3] 
console.log(array.reverse()); // [3, 2, 1] 

或交易時用數字加一個負號表示返回下降列表:

_.sortBy([-3, -2, 2, 3, 1, 0, -1], function(num) { 
    return -num; 
}); // [3, 2, 1, 0, -1, -2, -3] 

引擎蓋下.sortBy使用內置的.sort([handler])

// Default is ascending: 
[2, 3, 1].sort(); // [1, 2, 3] 

// But can be descending if you provide a sort handler: 
[2, 3, 1].sort(function(a, b) { 
    // a = current item in array 
    // b = next item in array 
    return b - a; 
}); 
+9

最後的解決方案,即添加negetive符號返回數量是完美的。 – vinesh 2014-11-14 22:03:04

+0

你爲什麼認爲這是泡沫排序?在''.sortBy()'調用內置的'Array.sort()'之下,其算法取決於瀏覽器供應商,但冒泡排序不太可能是他們的選擇。 – 2015-12-11 19:38:09

+0

這不會增加時間複雜度嗎?它會導致列表排序兩次。 – user1477388 2016-04-21 16:21:35

46

使用下劃線降序可以通過-1的返回值相乘來完成。

//Ascending Order: 
_.sortBy([2, 3, 1], function(num){ 
    return num; 
}); // [1, 2, 3] 


//Descending Order: 
_.sortBy([2, 3, 1], function(num){ 
    return num * -1; 
}); // [3, 2, 1] 

如果你的字符串不是數字排序,你可以使用charCodeAt()方法得到的Unicode值。

//Descending Order Strings: 
_.sortBy(['a', 'b', 'c'], function(s){ 
    return s.charCodeAt() * -1; 
}); 
+3

我想按字母順序排序 - 乘以-1不是一個有效的操作。 :) – rythos42 2013-11-13 21:20:55

+0

它是一個值得使用的案例,但沒有在問題中指定。但是,將字符串乘以-1是有效的操作。它返回NaN,這是一個有效的結果。 – jEremyB 2013-11-14 01:41:36

+5

+1以避免'array.reverse'操作 – 2014-01-02 22:58:13

39

Array prototype's reverse method修改數組,並返回對它的引用,這意味着你可以這樣做:

var sortedAsc = _.sortBy(collection, 'propertyName'); 
var sortedDesc = _.sortBy(collection, 'propertyName').reverse(); 

而且,下劃線文檔讀取:

此外, Array prototype's methods通過鏈接的下劃線對象代理,因此您可以將reversepush滑入您的鏈中,並繼續修改該數組。

,這意味着你還可以使用.reverse()同時鏈接:

var sortedDescAndFiltered = _.chain(collection).sortBy('propertyName').reverse().filter(_.property('isGood')).value(); 
+0

在最簡單的用例中,這是通過反向/降序排序的最簡單方法。 – 2015-09-08 12:57:55

+2

要做一個不區分大小寫的字母排序:'_.sortBy(collection,item => item。propertyName.toLowerCase());' – 2016-09-06 01:27:49

+0

如果數組中有負數,這不起作用。 – 2016-11-14 20:28:18

6

強調圖書館類似的還有被稱爲有一個方法「排序依據」這需要在參數來確定「lodash」另一個庫以何種順序排序。你可以使用它像

_.orderBy('collection', 'propertyName', 'desc') 

由於某種原因,它沒有記錄在網站上的文檔。

+0

我覺得你把[下劃線](http://underscorejs.org/)與[lodash](https://lodash.com/)混淆了。只有後者才提到[orderBy函數](https://lodash.com/docs/latest#orderBy)。 – 2017-07-02 12:28:53

+0

是的,我的壞。將更新答案。謝謝糾正:) – 2017-07-03 06:40:56

+0

'orderBy',超好用!比使用反轉要好得多,因爲它保留了我正在尋找的穩定排序屬性。 – Flimm 2017-08-02 14:09:43

相關問題