web-dev-qa-db-ja.com

Underscore.js大文字と小文字を区別しない並べ替え

Underscore.jsで大文字と小文字を区別しないソートを実行しようとすると、若干の問題が発生します。オブジェクトの配列があり、プロパティ名で並べ替えることができます。

ショートカットメソッドの使用 sortBy

iterateeは、ソートするプロパティの文字列名(長さなど)でもかまいません。

ソートされる配列:

var array = [{ name: 'test_1234', description: 'zzaaa bb cc'}, 
         { name: 'zz1111', description: 'ZAAbbbcc'}, 
         { name: 'TEST', description: '4422'}, 
         { name: '1a2929', description: 'abcdef'}, 
         { name: 'abc', description: 'Full description'}, 
         { name: 'GGGGH', description: '123456'}];

このメソッドsortProperty = 'name'を使用してソートすると、結果は大文字より小文字の前に配置されます。

var sorted = _.sortBy(array, sortProperty);

1a2929 - abcdef
GGGGH - 123456
TEST - 4422
abc - Full description
test_1234 - zzaaa bb cc
zz1111 - ZAAbbbcc

これは大文字と小文字の区別に関係していると思いますが、配列内の名前を小文字に変更してその方法を比較する方法がわかりません。

どんな助けも大歓迎です。

編集:指摘したように、名前または関数を渡すので、ソートするフィールドを返すように関数を調整しました: http://jsfiddle.net/rjaqp1vg/5/

27
user1549008

ソートする名前は、フィールド名OR関数である可能性があるため、小文字変換を行う関数を渡します。

var sorted = _.sortBy(array, function (i) { return i.name.toLowerCase(); });

トリックを行う必要があります。

68
Chris Tavares

これには_.sortByを使用しないでください。文字列をアルファベット順にソートする正しい方法は、localeCompareを使用することです。純粋なJavascriptの例を次に示します。

['Z', 'A','z','á', 'V'].sort(function(a, b){
   return a.localeCompare(b, undefined /* Ignore language */, { sensitivity: 'base' }) 
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare を参照してください。

15
Brad Vogel