web-dev-qa-db-ja.com

文字列で配列を含む配列をソートします

複数の配列を含む配列があり、それらの配列内の特定の文字列に基づいて配列を並べたいと思います。

var myArray = [
                [1, 'alfred', '...'],
                [23, 'berta', '...'],
                [2, 'zimmermann', '...'],
                [4, 'albert', '...'],
              ];

albertが最初に来てzimmermannが最後になるように名前でソートするにはどうすればよいですか?

整数を並べ替えに使用できる場合はどうすればよいかわかりますが、文字列には手がかりがありません。

お手伝いありがとうございます! :)

55
dmnkhhn

これは、サポート関数を引数としてArray.sortメソッド呼び出しに渡すことで実現できます。

このようなもの:

 function Comparator(a, b) {
   if (a[1] < b[1]) return -1;
   if (a[1] > b[1]) return 1;
   return 0;
 }

 var myArray = [
   [1, 'alfred', '...'],
   [23, 'berta', '...'],
   [2, 'zimmermann', '...'],
   [4, 'albert', '...'],
 ];

 myArray = myArray.sort(Comparator);
 console.log(myArray);
92
Martin Milan

array.sort()をカスタム関数で引き続き使用できます。関数内で、キーとして使用する要素を比較するだけです。たとえば、次を使用できます。

myArray.sort(function(a, b) { 
    return a[1] > b[1] ? 1 : -1;
});
40
vhallac

より簡単な方法があります:

myArray = myArray.sort(function(a, b) {
    return a[1].localeCompare(b[1]);
})

大文字と小文字も区別されません。

ソース: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

12
luschn

驚くばかり!この例では、最初の要素、2番目の要素、3番目の要素がすべて昇順で複合ソートされます。

myArray=myArray.sort(function(a,b){
    retVal=0;
    if(a[0]!=b[0]) retVal=a[0]>b[0]?1:-1;
    else if(a[1]!=b[1]) retVal=a[1]>b[1]?1:-1;
    else if(a[2]!=b[2]) retVal=a[2]>b[2]?1:-1;
    return retVal
});

(複数の列での複数の並べ替え)

7
gordon

ES6では、比較的簡潔なことができます。

myArray.sort(([a], [b]) => a.localeCompare(b))

または

myArray.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)

有用な/最新のビットは=>ラムダ演算子、および[X]引数の破壊。

5
Brian M. Hunt