前提・実現したいこと
以前、こちらの質問で、配列の並び替えに関してご教示いただいたのですが、
IE11では、localeCompareがうまく動作しなかったので、代替の方法を教えていただきたいです。
下記コメントのような並び替えを考えています。
ご教示お願いします。
JavaScript
1 2//要素の並び順が、 3//オブジェクトのgradeのアルファベットの昇順で優先に並べられていて、 4//gradeごとにnameが昇順の配列。 5//要素は、gradeとnameを持つ任意のオブジェクトで、 6//上記の並び順だけが保証されている。 7 8var arr = [ 9 { grade: 'A', name: 'いいA' }, 10 { grade: 'B', name: 'ああB' }, 11 { grade: 'S', name: 'ああS' }, 12 { grade: 'A', name: 'ああA' }, 13 { grade: 'S', name: 'ええS' } 14]; 15 16 17//目的の並び替え。 18//gradeでSだけをトップに持ってきて、 19//以降のgradeはアルファベットの昇順のままとなる。 20//gradeごとにnameが昇順であることも保たれている。 21 22var arr = [ 23 { grade: 'S', name: 'ああS' }, 24 { grade: 'S', name: 'ええS' } 25 { grade: 'A', name: 'ああA' }, 26 { grade: 'A', name: 'いいA' }, 27 { grade: 'B', name: 'ああB' }, 28];
試したこと
JavaScript
1 arr.sort(function(a, b) { 2 if (a.name > b.name) { 3 return 1; 4 }else if (a.name < b.name){ 5 return -1; 6 }else{ 7 return 0; 8 } 9 }); 10 11 arr.sort(function(a, b){ 12 if (a.grade === 'S') return -1; 13 if (b.grade === 'S') return 1; 14 if (a.grade < b.grade){ 15 return -1; 16 }else if (a.grade > b.grade) { 17 return 1; 18 }else{ 19 return 0; 20 } 21 });
上記でうまくいくと考えたのですが、Sグレードに関して、nameが意図しない並び順となってしまいました。
{ grade: 'S', name: 'ええS' } { grade: 'S', name: 'ああS' }, { grade: 'A', name: 'ああA' }, { grade: 'A', name: 'いいA' }, { grade: 'B', name: 'ああB' },
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/19 06:38
2019/12/19 06:43