回答編集履歴

7

テキスト修正

2019/12/05 00:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -132,7 +132,7 @@
132
132
 
133
133
  ### 追記2
134
134
 
135
-
135
+ ご質問の本題からは離れるかもしれませんが、以下、参考までに追記します。
136
136
 
137
137
  もし、ご質問の前提である、入力される配列
138
138
 
@@ -178,7 +178,7 @@
178
178
 
179
179
  ```
180
180
 
181
- あれば、[sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) に渡す比較関数を以下のようにすればよいかと思います。
181
+ られると望ましということしたら、[sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) に渡す比較関数を以下のようにすればよいかと思います。
182
182
 
183
183
 
184
184
 

6

テキスト修正

2019/12/05 00:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -206,4 +206,8 @@
206
206
 
207
207
  ```
208
208
 
209
+ 以下は、 要素をランダムに入れ換えた`objArray`を作り、それを上記の比較関数によってソートするサンプルです。
210
+
211
+
212
+
209
213
  - 動作確認用CodePen: [https://codepen.io/jun68ykt/pen/PowqZGM?editors=0012](https://codepen.io/jun68ykt/pen/PowqZGM?editors=0012)

5

テキスト修正

2019/12/05 00:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -127,3 +127,83 @@
127
127
  ```
128
128
 
129
129
  - 動作確認用CodePen: [https://codepen.io/jun68ykt/pen/oNgXjqo?editors=0012](https://codepen.io/jun68ykt/pen/oNgXjqo?editors=0012)
130
+
131
+
132
+
133
+ ### 追記2
134
+
135
+
136
+
137
+ もし、ご質問の前提である、入力される配列
138
+
139
+ ```
140
+
141
+ var objArray = [
142
+
143
+ { grade: 'A', number: 2 },
144
+
145
+ { grade: 'A', number: 3 },
146
+
147
+ { grade: 'B', number: 1 },
148
+
149
+ { grade: 'B', number: 2 },
150
+
151
+ { grade: 'S', number: 1 },
152
+
153
+ { grade: 'S', number: 2 }
154
+
155
+ ];
156
+
157
+ ```
158
+
159
+ を得るためのソートを見直すことが可能で、ソートした結果として
160
+
161
+ ```
162
+
163
+ [
164
+
165
+ { grade: 'S', number: 1 },
166
+
167
+ { grade: 'S', number: 2 },
168
+
169
+ { grade: 'A', number: 2 },
170
+
171
+ { grade: 'A', number: 3 },
172
+
173
+ { grade: 'B', number: 1 },
174
+
175
+ { grade: 'B', number: 2 }
176
+
177
+ ]
178
+
179
+ ```
180
+
181
+ を得たいのであれば、[sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) に渡す比較関数を以下のようにすればよいかと思います。
182
+
183
+
184
+
185
+ ```javascript
186
+
187
+ const compare = (a, b) => {
188
+
189
+
190
+
191
+ if (a.grade !== b.grade) {
192
+
193
+ if (a.grade === 'S') return -1;
194
+
195
+ if (b.grade === 'S') return 1;
196
+
197
+ return a.grade.localeCompare(b.grade);
198
+
199
+ }
200
+
201
+
202
+
203
+ return a.number - b.number;
204
+
205
+ };
206
+
207
+ ```
208
+
209
+ - 動作確認用CodePen: [https://codepen.io/jun68ykt/pen/PowqZGM?editors=0012](https://codepen.io/jun68ykt/pen/PowqZGM?editors=0012)

4

テキスト修正

2019/12/05 00:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- または、 `tkshp` さんのコードにある、 「`while` の条件式の中でpopした要素を変数に格納する」というやり方を踏襲するならば、以下です。
45
+ または、 `tkshp` さんのコードにある、 「`while`の条件式の中でpopして、末尾にあった要素を変数に格納する」というやり方を踏襲するならば、以下です。
46
46
 
47
47
 
48
48
 

3

テキスト修正

2019/12/05 00:07

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -39,6 +39,32 @@
39
39
  ```
40
40
 
41
41
  - 動作確認用CodePen: [https://codepen.io/jun68ykt/pen/zYxGGgx?editors=0012](https://codepen.io/jun68ykt/pen/zYxGGgx?editors=0012)
42
+
43
+
44
+
45
+ または、 `tkshp` さんのコードにある、 「`while` の条件式の中で、popした要素を変数に格納する」というやり方を踏襲するならば、以下です。
46
+
47
+
48
+
49
+ ```javascript
50
+
51
+ var sValue;
52
+
53
+ while((sValue = objArray.pop()).grade === "S") {
54
+
55
+ objArray.unshift(sValue);
56
+
57
+ }
58
+
59
+ objArray.push(sValue);
60
+
61
+ ```
62
+
63
+ - 動作確認用CodePen: [https://codepen.io/jun68ykt/pen/MWYwaMj?editors=0012](https://codepen.io/jun68ykt/pen/MWYwaMj?editors=0012)
64
+
65
+
66
+
67
+ 上記のように、 `while` の条件の中で pop させると、 `while` から抜けた後に、最後にpopされた(gradeが 'S'ではない)要素を再度、objArray に追加しなければなりません。
42
68
 
43
69
 
44
70
 

2

テキスト修正

2019/12/04 23:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
 
54
54
 
55
- とありましたので、別解を挙げます。
55
+ とありましたので、(簡潔になっているかは分かりませんが、)別解を挙げます。
56
56
 
57
57
  このご質問の前提である、入力される配列は
58
58
 

1

テキスト修正

2019/12/04 23:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -39,3 +39,65 @@
39
39
  ```
40
40
 
41
41
  - 動作確認用CodePen: [https://codepen.io/jun68ykt/pen/zYxGGgx?editors=0012](https://codepen.io/jun68ykt/pen/zYxGGgx?editors=0012)
42
+
43
+
44
+
45
+ ### 追記
46
+
47
+ ご質問に
48
+
49
+
50
+
51
+ > もしくはもっと簡潔な組み方はありますか?
52
+
53
+
54
+
55
+ とありましたので、別解を挙げます。
56
+
57
+ このご質問の前提である、入力される配列は
58
+
59
+ ```
60
+
61
+ var objArray = [
62
+
63
+ { grade: 'A', number: 2 },
64
+
65
+ { grade: 'A', number: 3 },
66
+
67
+ { grade: 'B', number: 1 },
68
+
69
+ { grade: 'B', number: 2 },
70
+
71
+ { grade: 'S', number: 1 },
72
+
73
+ { grade: 'S', number: 2 }
74
+
75
+ ];
76
+
77
+ ```
78
+
79
+ というもので、この配列のインデクス4の要素`{ grade: 'S', number: 1 }`から末尾の要素`{ grade: 'S', number: 2 }`までの部分配列を、先頭に移動するにはどうしたらいいか?というのが与題です。 `tkshp` さんのご質問にあるコードは `while`を使って1個ずつ移動するものですが、「(1個ずつではなく)部分配列ごと移動する」あるいは「ある配列を(共通部分を持たない)2つの部分配列に分割し、それらを入れ換える」という考え方もできます。以下はこの考え方によるコードです。
80
+
81
+
82
+
83
+ ```javascript
84
+
85
+ const startIndexOfGradeS = objArray.findIndex(e => e.grade === 'S');
86
+
87
+
88
+
89
+ if (startIndexOfGradeS >= 0) {
90
+
91
+ objArray = [
92
+
93
+ ...objArray.slice(startIndexOfGradeS),
94
+
95
+ ...objArray.slice(0, startIndexOfGradeS)
96
+
97
+ ];
98
+
99
+ }
100
+
101
+ ```
102
+
103
+ - 動作確認用CodePen: [https://codepen.io/jun68ykt/pen/oNgXjqo?editors=0012](https://codepen.io/jun68ykt/pen/oNgXjqo?editors=0012)