我目前正在使用underscorejs来排序我的json排序。现在我要求使用underscore.js进行ascending
和descending
排序。我在文档中没有看到任何相同的内容。我怎样才能做到这一点?
答案 0 :(得分:346)
您可以使用.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;
});
答案 1 :(得分:55)
使用下划线的降序可以通过将返回值乘以-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;
});
答案 2 :(得分:46)
Array prototype's reverse method修改数组并返回对它的引用,这意味着你可以这样做:
var sortedAsc = _.sortBy(collection, 'propertyName');
var sortedDesc = _.sortBy(collection, 'propertyName').reverse();
此外,下划线文档为:
此外,Array prototype's methods通过链接的Underscore对象进行代理,因此您可以将
reverse
或push
放入链中,然后继续修改数组。
这意味着您还可以在链接时使用.reverse()
:
var sortedDescAndFiltered = _.chain(collection)
.sortBy('propertyName')
.reverse()
.filter(_.property('isGood'))
.value();
答案 3 :(得分:9)
与Underscore库类似,还有另一个名为“< lodash'有一种方法" orderBy"它接受参数以确定对其进行排序的顺序。您可以像
一样使用它_.orderBy('collection', 'propertyName', 'desc')
出于某种原因,它没有记录在网站文档中。
答案 4 :(得分:0)
下划线Mixins
扩展@emil_lundberg的答案,如果您要使用Underscore进行排序的自定义函数,也可以编写一个“ mixin”,如果您要在某处的应用程序中重复这种排序的话。
例如,也许您有一个控制器或查看排序结果为“ ASC”或“ DESC”的排序结果,并且想要在该排序之间进行切换,可以执行以下操作:
Mixin.js
_.mixin({
sortByOrder: function(stooges, prop, order) {
if (String(order) === "desc") {
return _.sortBy(stooges, prop).reverse();
} else if (String(order) === "asc") {
return _.sortBy(stooges, prop);
} else {
return stooges;
}
}
})
用法示例
var sort_order = "asc";
var stooges = [
{name: 'moe', age: 40},
{name: 'larry', age: 50},
{name: 'curly', age: 60},
{name: 'July', age: 35},
{name: 'mel', age: 38}
];
_.mixin({
sortByOrder: function(stooges, prop, order) {
if (String(order) === "desc") {
return _.sortBy(stooges, prop).reverse();
} else if (String(order) === "asc") {
return _.sortBy(stooges, prop);
} else {
return stooges;
}
}
})
// find elements
var banner = $("#banner-message");
var sort_name_btn = $("button.sort-name");
var sort_age_btn = $("button.sort-age");
function showSortedResults(results, sort_order, prop) {
banner.empty();
banner.append("<p>Sorting: " + prop + ', ' + sort_order + "</p><hr>")
_.each(results, function(r) {
banner.append('<li>' + r.name + ' is '+ r.age + ' years old.</li>');
})
}
// handle click and add class
sort_name_btn.on("click", function() {
sort_order = (sort_order === "asc") ? "desc" : "asc";
var sortedResults = _.sortByOrder(stooges, 'name', sort_order);
showSortedResults(sortedResults, sort_order, 'name');
})
sort_age_btn.on('click', function() {
sort_order = (sort_order === "asc") ? "desc" : "asc";
var sortedResults = _.sortByOrder(stooges, 'age', sort_order);
showSortedResults(sortedResults, sort_order, 'age');
})
这是一个JSFiddle演示:JSFiddle for SortBy Mixin