2013-02-28 131 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

相关问题