私は現在、jsonの並べ替えにunderscorejsを使用しています。今、underscore.js を使用しascending
て並べ替えを行うように依頼しました。descending
ドキュメントには、同じことに関するものは何もありません。どうすればこれを達成できますか?
5 に答える
を使用できます.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 alphanumeric 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 を掛けることで実行できます。
//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;
});
Array プロトタイプのreverse メソッドは、配列を変更し、それへの参照を返します。これは、次のことができることを意味します。
var sortedAsc = _.sortBy(collection, 'propertyName');
var sortedDesc = _.sortBy(collection, 'propertyName').reverse();
また、アンダースコアのドキュメントには次のように書かれています。
さらに、Array プロトタイプのメソッドはチェーン化された Underscore オブジェクトを介してプロキシされるため、a
reverse
または apush
をチェーンに滑り込ませて、配列を変更し続けることができます。
.reverse()
つまり、連鎖中にも使用できます。
var sortedDescAndFiltered = _.chain(collection)
.sortBy('propertyName')
.reverse()
.filter(_.property('isGood'))
.value();
アンダースコア ミックスイン
@emil_lundbergの回答を拡張して、Underscoreを使用してソート用のカスタム関数を作成している場合、それがアプリケーションのどこかで繰り返す可能性のある一種のソートである場合、「ミックスイン」を作成することもできます。
たとえば、「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 を次に示します。SortBy Mixin の JSFiddle