Javascript sort
(Underscore.jsを使用)を使用しています。
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
> ["Alice", "Bob", "Mary"]
配列が他の方法を返すようにしたい。それ、どうやったら出来るの?
[「メリー」、「ボブ」、「アリス」]
並べ替えた後は元に戻したくありません。最初に別の方法で作成したいです。
ありがとう。
Underscoreが内部で行うことを行うだけです。 Array#sort メソッドを使用します。
["Bob", "Mary", "Alice"].sort(function (a, b) {
if (a < b) return 1;
if (b < a) return -1;
return 0;
});
または、元の配列を変更したくない場合は、最初に複製します。
_.clone(["Bob", "Mary", "Alice"]).sort(...)
アンダースコアーを捨てる代わりに、 Array.reverse
両方の長所を活用します。
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
.reverse()
ES6の1ライナーでこれを行うことができます。必要な方向に応じて_>
_を変更するだけです。
.sort()
はIE6以降でサポートされており、1または-1を返す関数を渡すだけです。
_["Bob", "Mary", "Alice].sort((a, b) => a > b ? 1 : -1);
_
並べ替えてから結果を逆にするのがはるかに理にかなっているので、これを行うべきではないことは明らかです.
_.sortBy(["Bob", "Mary", "Alice"], function (a) {
// split each string into single characters
// ... then swap for inverse character from unicode range
// ... and glue the characters back together into an inversely sortable string
return _.map(a.split(''), function(i){
return String.fromCharCode(65536 - i.charCodeAt(0));
}).join('');
});
...また、アンダースコアは、一貫性のある並べ替え順序に関する小さなクロスプラットフォームの問題があるネイティブjavascript並べ替えとは微妙に異なります...
CompareFunction(a、b)が0を返す場合、aとbを互いに変更せず、すべての異なる要素に関して並べ替えます。注:ECMAscript標準ではこの動作が保証されていないため、すべてのブラウザー(少なくとも2003年に遡るMozillaバージョンなど)がこれを尊重しているわけではありません。 Array.prototype.sort() (
アンダースコアの.sortBy
ドキュメントの状態:
リストの(安定した)ソートされたコピーを返します。 _。sortBy
0
を返す代わりにアイテムの順序を維持するために、左側のインデックスから右側のインデックスを引いた値を返します。
_.sortBy = function(obj, iteratee, context) {
iteratee = cb(iteratee, context);
return _.pluck(_.map(obj, function(value, index, list) {
return {
value: value,
index: index,
criteria: iteratee(value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria;
var b = right.criteria;
if (a !== b) {
if (a > b || a === void 0) return 1;
if (a < b || b === void 0) return -1;
}
return left.index - right.index;
}), 'value');
};