web-dev-qa-db-ja.com

Underscore.jsでJavascriptを使用して他の方法でソートする

Javascript sort(Underscore.jsを使用)を使用しています。

_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
> ["Alice", "Bob", "Mary"]

配列が他の方法を返すようにしたい。それ、どうやったら出来るの?

[「メリー」、「ボブ」、「アリス」]

並べ替えた後は元に戻したくありません。最初に別の方法で作成したいです。

ありがとう。

41
Harry

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(...)
34
Felix Loether

アンダースコアーを捨てる代わりに、 Array.reverse 両方の長所を活用します。

_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
 .reverse()
79
h--n

ES6の1ライナーでこれを行うことができます。必要な方向に応じて_>_を変更するだけです。

.sort()はIE6以降でサポートされており、1または-1を返す関数を渡すだけです。

_["Bob", "Mary", "Alice].sort((a, b) => a > b ? 1 : -1);
_
0
Fasani

並べ替えてから結果を逆にするのがはるかに理にかなっているので、これを行うべきではないことは明らかです.

_.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');
};
0
Billy Moon