前提・実現したいこと
下記のコードのような配列を、コメントのように並び変えたいのですが、
どういったコードを組めばよいでしょうか?
やり方によっては、かなり冗長なコードになってしまいそうなので、効率的な書き方を考えています。
ご教示お願いします。
JavaScript
1//要素の並び順が、 2//オブジェクトのgradeのアルファベットの昇順で優先に並べられていて、 3//gradeごとにnumberが昇順の配列。 4//要素は、gradeとnumberを持つ任意のオブジェクトで、 5//上記の並び順だけが保証されている。 6var objArray = [ 7 { grade: 'A', number: 2 }, 8 { grade: 'A', number: 3 }, 9 { grade: 'B', number: 1 }, 10 { grade: 'B', number: 2 }, 11 { grade: 'S', number: 1 }, 12 { grade: 'S', number: 2 } 13]; 14 15//目的の並び替え。 16//gradeでSだけをトップに持ってきて、 17//以降のgradeはアルファベットの昇順のままとなる。 18//gradeごとにnumberが昇順であることも保たれている。 19// var objArray = [ 20// { grade: 'S', number: 1 }, 21// { grade: 'S', number: 2 }, 22// { grade: 'A', number: 2 }, 23// { grade: 'A', number: 3 }, 24// { grade: 'B', number: 1 }, 25// { grade: 'B', number: 2 }, 26// ]; 27
試したこと
イメージ的には、下記のようなwhile文の書き方がスマートな気がするのですが、
条件で代入はできないのでしょうか?
構文エラーになってしまいます。
JavaScript
1//要素の並び順が、 2//オブジェクトのgradeのアルファベットの昇順で優先に並べられていて、 3//gradeごとにnumberが昇順の配列。 4//要素は、gradeとnumberを持つ任意のオブジェクトで、 5//上記の並び順だけが保証されている。 6var objArray = [ 7 { grade: 'A', number: 2 }, 8 { grade: 'A', number: 3 }, 9 { grade: 'B', number: 1 }, 10 { grade: 'B', number: 2 }, 11 { grade: 'S', number: 1 }, 12 { grade: 'S', number: 2 } 13]; 14 15while((var sValue = objArray.pop["grade"]) == "S"){ 16 objArray.unshift(sValue); 17} 18 19//目的の並び替え。 20//gradeでSだけをトップに持ってきて、 21//以降のgradeはアルファベットの昇順のままとなる。 22//gradeごとにnumberが昇順であることも保たれている。 23// var objArray = [ 24// { grade: 'S', number: 1 }, 25// { grade: 'S', number: 2 }, 26// { grade: 'A', number: 2 }, 27// { grade: 'A', number: 3 }, 28// { grade: 'B', number: 1 }, 29// { grade: 'B', number: 2 }, 30// ]; 31
エラーメッセージ。
while((var sValue = objArray.pop["grade"]) == "S"){ ^^^ SyntaxError: Unexpected token var
さらに考えたのですが、この書き方だと代入できたとしても、
sValueにオブジェクトじゃなくて、gradeの値が入ってしまうことに気づきました。
このようなイメージでコードを組むことは可能ですか?
もしくはもっと簡潔な組み方はありますか?
ご教示お願いします。
追記 VSCodeでデバッグを繰り返すと、並び順が変わる問題について。
VSCodeでデバッグを繰り返すと、何故か並び順がたまに変わるという現象が起きました。
VSCodeのデバッグでは、
console.log(objArray);
では、要素のオブジェクトがObjectと表示されるだけで、オブジェクトの中身まで表示されないので、
forEachで回して表示させるようにしました。
JavaScript
1 var objArray = [ 2 { grade: 'B', number: 2 }, 3 { grade: 'S', number: 2 }, 4 { grade: 'A', number: 2 }, 5 { grade: 'A', number: 3 }, 6 { grade: 'B', number: 1 }, 7 { grade: 'S', number: 1 }, 8 ]; 9 10const compare = (a, b) => { 11 12 if (a.grade !== b.grade) { 13 if (a.grade === 'S') return -1; 14 if (b.grade === 'S') return 1; 15 return a.grade.localeCompare(b.grade); 16 } 17 18 return a.number - b.number; 19}; 20 21objArray.sort(compare); 22 23//console.log(objArray); 24 25objArray.forEach(function( value ) { 26 console.log( value ); 27});
上記をデバッグすると、基本的には下記出力となるのですが、
Object {grade: "S", number: 1} Object {grade: "S", number: 2} Object {grade: "A", number: 2} Object {grade: "A", number: 3} Object {grade: "B", number: 1} Object {grade: "B", number: 2}
しかし、デバッグを繰り返すと、下記のような出力になることもあります。
Object {grade: "S", number: 1} Object {grade: "S", number: 2} Object {grade: "B", number: 1} Object {grade: "A", number: 2} Object {grade: "B", number: 2} Object {grade: "A", number: 3}
下記のようになったりもしました。
Object {grade: "S", number: 1} Object {grade: "S", number: 2} Object {grade: "A", number: 2} Object {grade: "B", number: 1} Object {grade: "A", number: 3} Object {grade: "B", number: 2}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/04 15:26
2019/12/05 01:14