回答編集履歴

36

テキスト修正

2018/09/16 01:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -366,4 +366,4 @@
366
366
 
367
367
 
368
368
 
369
- 上記の `slice` と `concat`を使った `orderBy` で事足りるということだと、ソートするとか rotateさせか、ちょ込み入ったことをする必要はありませんでした
369
+ 上記の `slice` と `concat`を使った `orderBy` で事足りるということだと、sort させたり、 rotateさせたり込み入ったことをする必要はありませんでした。あとは、もともと `hoge`が date でソートされているかどうか、といった要件しだいで、お好みの方法を比較検討して頂ければと思います。

35

テキスト修正

2018/09/16 01:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -232,7 +232,7 @@
232
232
 
233
233
 
234
234
 
235
- **追記**
235
+ **追記1**
236
236
 
237
237
 
238
238
 
@@ -323,3 +323,47 @@
323
323
 
324
324
 
325
325
  [https://jsfiddle.net/jun68ykt/tycq3g28/15/](https://jsfiddle.net/jun68ykt/tycq3g28/15/)
326
+
327
+
328
+
329
+
330
+
331
+ ---
332
+
333
+
334
+
335
+ **追記2**
336
+
337
+
338
+
339
+ 上記、追記1 の `orderBy` は、以下のようにも書けます。
340
+
341
+
342
+
343
+ ```javascript
344
+
345
+ hoge.orderBy = function(baseDate) {
346
+
347
+
348
+
349
+ if ( 1 <= baseDate && baseDate < this.length )
350
+
351
+ return this.slice(this.length - baseDate)
352
+
353
+ .concat(this.slice(0, this.length - baseDate));
354
+
355
+
356
+
357
+ return [...this];
358
+
359
+
360
+
361
+ };
362
+
363
+ ```
364
+
365
+ **サンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/16/](https://jsfiddle.net/jun68ykt/tycq3g28/16/)
366
+
367
+
368
+
369
+ 上記の `slice` と `concat`を使った `orderBy` で事足りるということだと、ソートするとか rotateさせるとか、ちょっと込み入ったことをする必要はありませんでしたね。

34

テキスト修正

2018/09/16 01:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -272,21 +272,17 @@
272
272
 
273
273
  hoge.orderBy = function(baseDate) {
274
274
 
275
- let that;
275
+ const that = [...this];
276
-
276
+
277
+
278
+
277
- if ( 1 <= baseDate && baseDate < this.length ) {
279
+ if ( 1 <= baseDate && baseDate < this.length )
278
-
279
- that = [...this];
280
+
280
-
281
- for ( i = 0; i < this.length - baseDate; ++ i )
281
+ for ( i = 0; i < this.length - baseDate; ++ i )
282
-
282
+
283
- that.push(that.shift())
283
+ that.push(that.shift());
284
-
285
- } else {
284
+
286
-
287
- that = this;
285
+
288
-
289
- }
290
286
 
291
287
  return that;
292
288
 
@@ -326,4 +322,4 @@
326
322
 
327
323
 
328
324
 
329
- [https://jsfiddle.net/jun68ykt/tycq3g28/11/](https://jsfiddle.net/jun68ykt/tycq3g28/11/)
325
+ [https://jsfiddle.net/jun68ykt/tycq3g28/15/](https://jsfiddle.net/jun68ykt/tycq3g28/15/)

33

テキスト修正

2018/09/16 00:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -223,3 +223,107 @@
223
223
 
224
224
 
225
225
  以上、参考になれば幸いです。
226
+
227
+
228
+
229
+
230
+
231
+ ---
232
+
233
+
234
+
235
+ **追記**
236
+
237
+
238
+
239
+ 長々と 回答(1)、(2)を書いてしまいましたが、もう少し見通しのいいコードで書けたので以下に追記します。
240
+
241
+
242
+
243
+ 配列 `hoge`
244
+
245
+ ```javascript
246
+
247
+ const hoge = [
248
+
249
+ { date:"7", status:"C" },
250
+
251
+ { date:"6", status:"B" },
252
+
253
+ { date:"5", status:"D" },
254
+
255
+ { date:"4", status:"B" },
256
+
257
+ { date:"3", status:"A" },
258
+
259
+ { date:"2", status:"C" },
260
+
261
+ { date:"1", status:"A" }
262
+
263
+ ];
264
+
265
+ ```
266
+
267
+ に以下のようなメソッドを追加します。
268
+
269
+
270
+
271
+ ```
272
+
273
+ hoge.orderBy = function(baseDate) {
274
+
275
+ let that;
276
+
277
+ if ( 1 <= baseDate && baseDate < this.length ) {
278
+
279
+ that = [...this];
280
+
281
+ for ( i = 0; i < this.length - baseDate; ++ i )
282
+
283
+ that.push(that.shift())
284
+
285
+ } else {
286
+
287
+ that = this;
288
+
289
+ }
290
+
291
+ return that;
292
+
293
+ };
294
+
295
+ ```
296
+
297
+
298
+
299
+ この `orderBy` を使うことで、たとえば `baseDate` に 4 を指定して並べ替えた配列 `hoge4` を得るには、
300
+
301
+
302
+
303
+ ```javascript
304
+
305
+ const hoge4 = hoge.orderBy(4);
306
+
307
+ ```
308
+
309
+
310
+
311
+ とすればよいです。この`orderBy`は、 `hoge` の順序は変更しないので、続けて
312
+
313
+ ```javascript
314
+
315
+ const hoge2 = hoge.orderBy(2);
316
+
317
+ ```
318
+
319
+ などとしても、望ましい結果が返ります。
320
+
321
+
322
+
323
+
324
+
325
+ 以下、この `orderBy` を使ったサンプルです。
326
+
327
+
328
+
329
+ [https://jsfiddle.net/jun68ykt/tycq3g28/11/](https://jsfiddle.net/jun68ykt/tycq3g28/11/)

32

テキスト修正

2018/09/16 00:50

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  ```
48
48
 
49
- の各要素の `date` プロパティを整数に変換した値を引いた差を要素とする配列
49
+ の各要素の `date` プロパティを整数に変換した値) を引いた差配列
50
50
 
51
51
  ```javascript
52
52
 

31

テキスト修正

2018/09/15 23:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
  ```javascript
52
52
 
53
- [-3, -2, -1, 0, 1, 2, 3];
53
+ [-3, -2, -1, 0, 1, 2, 3]; // = [ 4-"7", 4-"6", 4-"5", 4-"4", 4-"3", 4-"2", 4-"1" ]
54
54
 
55
55
  ```
56
56
 

30

テキスト修正

2018/09/15 23:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -128,9 +128,7 @@
128
128
 
129
129
 
130
130
 
131
-  
132
-
133
-  
131
+
134
132
 
135
133
  なお上記の比較関数によるソートは、 与えられる配列`hoge` が、 `date`でソートされていなくても望む結果が得られます。たとえば `hoge` が
136
134
 

29

テキスト修正

2018/09/15 23:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
 
126
126
 
127
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/6zqrL49a/1/](https://jsfiddle.net/jun68ykt/6zqrL49a/1/)
127
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/6zqrL49a/1/](https://jsfiddle.net/jun68ykt/6zqrL49a/1/)
128
128
 
129
129
 
130
130
 
@@ -164,7 +164,7 @@
164
164
 
165
165
 
166
166
 
167
- `hoge` **が ** `date` **でソートされていない例:**[https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
167
+ - `hoge` **が ** `date` **でソートされていない例:**[https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
168
168
 
169
169
 
170
170
 
@@ -208,15 +208,15 @@
208
208
 
209
209
  を作っておいて、 `rotateByBaseDate(hoge, 4)` とすれば望む配列が得られます。
210
210
 
211
- 以下この `rotateByBaseDate` を使うサンプルコードを作成しました。
211
+ 以下、サンプルを作成しました。  
212
-
213
-
214
-
212
+
213
+
214
+
215
- ** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)
215
+ - ** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)      
216
-
217
-
218
-
216
+
217
+
218
+
219
- 上記のコードでは、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えます。
219
+  上記のコードでは、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えます。
220
220
 
221
221
 
222
222
 

28

テキスト修正

2018/09/15 22:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -174,11 +174,11 @@
174
174
 
175
175
 
176
176
 
177
- 上記の回答(1) は、与えられる配列`hoge` が date でソートされていなくても望結果を得るための回答でしたが、`hoge`の要素`date`の降順にソートされているは前提条件であるならば、配列 `hoge` を回転(rotate)させた配列を作るにはどうしたらいいか?という問題と考えることができます。
177
+ 上記の回答(1) は、初めに与えられる配列`hoge` が date でソートされていなくても望ましい結果を得るための回答でしたが、前提条件として`hoge`の要素`date`の降順にソートされているとるならば、配列 `hoge` を回転(rotate)させた配列を作るにはどうしたらいいか?という問題と考えることができます。
178
-
179
-
180
-
178
+
179
+
180
+
181
- 配列をrotateさせるためのコードは、以下の質問の回答に挙げられています。
181
+ 配列を回転(rotateさせるためのコードは、以下の質問の回答に挙げられています。
182
182
 
183
183
 
184
184
 
@@ -194,7 +194,7 @@
194
194
 
195
195
 
196
196
 
197
- の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) をお借りして、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
197
+ の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) をお借りすることにして、たとえば、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
198
198
 
199
199
 
200
200
 
@@ -208,15 +208,7 @@
208
208
 
209
209
  を作っておいて、 `rotateByBaseDate(hoge, 4)` とすれば望む配列が得られます。
210
210
 
211
-  
212
-
213
- なお、上記のコードで`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、たとえば `rotateByBaseDate(hoge, 5)` とすると望む結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
214
-
215
-
216
-
217
-
218
-
219
- 上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えるサンプルを以下に作成しました。
211
+ 以下に、この `rotateByBaseDate` を使うサンプルコードを作成しました。
220
212
 
221
213
 
222
214
 
@@ -224,9 +216,11 @@
224
216
 
225
217
 
226
218
 
227
-
228
-
229
-   
219
+ 上記のコードでは、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えます。
220
+
221
+
222
+
223
+ なお、`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、 `rotateByBaseDate(hoge, 5)` としたときに、望ましい結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
230
224
 
231
225
 
232
226
 

27

テキスト修正

2018/09/15 14:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
9
+ なお、以下の回答では、並べ替えた結果、先頭にくるべき要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
10
10
 
11
11
 
12
12
 
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- では、`baseDate` 4 ということになります。
17
+ では、`baseDate`として 4 を指定する、ということになります。
18
18
 
19
19
 
20
20
 

26

テキスト修正

2018/09/15 05:56

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- このご質問でeeengineeeeeeerさんが要望されている並べ替えを実現するために、異なる2つのアプローチがあると思いましたそれ以下の(1)、(2)回答します。
5
+ このご質問でeeengineeeeeeerさんが要望されている並べ替えを実現するために、異なる2つのアプローチがあると思いましたので、それぞれ以下の(1)、(2)として回答します。
6
6
 
7
7
 
8
8
 

25

テキスト修正

2018/09/15 05:23

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 以下、異なる考え方、方法による2つの方法を回答します。
5
+ このご質問でeeengineeeeeeerさんが要望されている並べ替えを実現するために、異なる2つのアプローチがあると思いました。それ以下の(1)、(2) で回答します。
6
6
 
7
7
 
8
8
 

24

テキスト修正

2018/09/15 04:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -174,7 +174,7 @@
174
174
 
175
175
 
176
176
 
177
- 上記の回答(1) は、与えられる配列`hoge` が date でソートされていなくても望む結果を得るための回答でしたが、`hoge`の要素が`date`の降順にソートされていることは前提条件であるならば、配列を回転(rotate)させればよいです。
177
+ 上記の回答(1) は、与えられる配列`hoge` が date でソートされていなくても望む結果を得るための回答でしたが、`hoge`の要素が`date`の降順にソートされていることは前提条件であるならば、配列 `hoge` を回転(rotate)させた配列を作るにはどうしたらいか?という問題と考えることがきます。
178
178
 
179
179
 
180
180
 
@@ -194,7 +194,7 @@
194
194
 
195
195
 
196
196
 
197
- の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を借しますと、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
197
+ の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
198
198
 
199
199
 
200
200
 

23

テキスト修正

2018/09/15 03:04

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -216,7 +216,7 @@
216
216
 
217
217
 
218
218
 
219
- 上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに 基準値 "4" 並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました。
219
+ 上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに `baseDate` 4 として並べ替え、次に 5 で並べ替えるサンプルを以下に作成しました。
220
220
 
221
221
 
222
222
 

22

テキスト修正

2018/09/15 02:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -164,7 +164,7 @@
164
164
 
165
165
 
166
166
 
167
- 初めに与えられる`hoge` **が ** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
167
+ `hoge` **が ** `date` **でソートされていない例:**[https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
168
168
 
169
169
 
170
170
 

21

テキスト修正

2018/09/15 02:51

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
 
66
66
 
67
- 上記のようなソートを行うための比較関数 `compare(a, b)` の一例が以下です。(他の書き方もあるょう。)
67
+ 上記のようなソートを行うための比較関数 `compare(a, b)` の一例が以下です。(他のより良い書き方もあるかもれません。)
68
68
 
69
69
 
70
70
 

20

テキスト修正

2018/09/15 02:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -118,13 +118,13 @@
118
118
 
119
119
 
120
120
 
121
- このように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` む配列が得られます。
121
+ このように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` によって、`hoge` がましい状態に並び替えられます。
122
-
123
-
124
-
125
-
126
-
122
+
123
+
124
+
125
+
126
+
127
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/fr2snba7/1/](https://jsfiddle.net/jun68ykt/fr2snba7/1/)
127
+ **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/6zqrL49a/1/](https://jsfiddle.net/jun68ykt/6zqrL49a/1/)
128
128
 
129
129
 
130
130
 
@@ -164,7 +164,7 @@
164
164
 
165
165
 
166
166
 
167
- `hoge` **が** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/fr2snba7/2/](https://jsfiddle.net/jun68ykt/fr2snba7/2/)
167
+ 初めに与えられる`hoge` **が ** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
168
168
 
169
169
 
170
170
 

19

テキスト修正

2018/09/15 02:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -64,31 +64,37 @@
64
64
 
65
65
 
66
66
 
67
- 上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。
67
+ 上記のようなソートを行うための比較関数 `compare(a, b)` の一例が以下です。(他の書き方もあるでしょう。)
68
-
69
-
70
-
71
- ```
68
+
72
-
69
+
70
+
73
- if ( a が 0 )
71
+ ```javascript
74
-
72
+
75
- 負の数を返す。
73
+ const compare = (a, b) => {
76
-
77
-
78
-
74
+
75
+
76
+
79
- if ( b が 0 )
77
+ // a または b が 0 である場合
80
-
81
-  正の数を返す。
78
+
82
-
83
-
84
-
85
- if ( a b は異符号 )
79
+ if ( a === 0 ) return -1;
80
+
86
-
81
+ if ( b === 0 ) return 1;
82
+
83
+
84
+
85
+ // a と b が異符号の場合
86
+
87
- b が負の数なら、負の数を返し、そうでないなら正の数を返す。
87
+ if ( a * b < 0 ) return b;
88
+
89
+
90
+
88
-
91
+ // a と b が同符号の場合
89
-
90
-
92
+
91
- 上記以外であれば、 a - b を返す。
93
+ return a - b;
94
+
95
+
96
+
97
+ };
92
98
 
93
99
  ```
94
100
 
@@ -98,51 +104,21 @@
98
104
 
99
105
 
100
106
 
101
- 上記考え方で作成した `compare(a,b)` が以下す。
107
+ の `compare(a,b)` を使うことで、ソート対象の配列 `ary` (hoge 与えられる想定) と、 `baseDate`を引数として取り、望ましい順序で並べ替えた配列を返す関数 `sortByBaseDate(ary, baseDate)` を以下のように書けます。
102
-
103
-
104
-
108
+
109
+
110
+
105
- ```javascript
111
+ ```javascript
106
-
107
- const compare = (a, b) => {
108
-
109
-
110
-
111
- // a または b が 0 である場合
112
-
113
- if ( a === 0 ) return -1;
114
-
115
- if ( b === 0 ) return 1;
116
-
117
-
118
-
119
- // a と b が異符号の場合
120
-
121
- if ( a * b < 0 ) return b;
122
-
123
-
124
-
125
- // a と b が同符号の場合
126
-
127
- return a - b;
128
-
129
-
130
-
131
- };
132
-
133
-
134
112
 
135
113
  const sortByBaseDate = (ary, baseDate) =>
136
114
 
137
115
  ary.sort((e1,e2) => compare(baseDate - e1.date, baseDate - e2.date));
138
116
 
139
-
140
-
141
- ```
117
+ ```
142
-
143
-
144
-
118
+
119
+
120
+
145
- 上記のように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
121
+ のように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
146
122
 
147
123
 
148
124
 

18

テキスト修正

2018/09/15 02:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -74,17 +74,21 @@
74
74
 
75
75
  負の数を返す。
76
76
 
77
+
78
+
77
- else if ( b が 0 )
79
+ if ( b が 0 )
78
80
 
79
81
   正の数を返す。
80
82
 
83
+
84
+
81
- else if ( a と b は異符号 )
85
+ if ( a と b は異符号 )
82
86
 
83
87
  b が負の数なら、負の数を返し、そうでないなら正の数を返す。
84
88
 
85
- else /* a と b とは同符号 */
89
+
86
-
90
+
87
- a - b を返す。
91
+ 上記以外であれば、 a - b を返す。
88
92
 
89
93
  ```
90
94
 

17

テキスト修正

2018/09/15 02:30

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -70,23 +70,31 @@
70
70
 
71
71
  ```
72
72
 
73
- if ( a か b のいずれかが 0 )
73
+ if ( a が 0 )
74
+
74
-
75
+ 負の数を返す。
76
+
75
- a が0ならば負の数を返し、 そうでないなら正の数を返す。
77
+ else if ( b 0 )
78
+
76
-
79
+  正の数を返す。
80
+
77
- else if ( a と b 符号 )
81
+ else if ( a と b は符号 )
82
+
83
+ b が負の数なら、負の数を返し、そうでないなら正の数を返す。
84
+
85
+ else /* a と b とは同符号 */
78
86
 
79
87
  a - b を返す。
80
88
 
81
- else
82
-
83
- b が負の数なら、負の数を返し、そうでないなら正の数を返す。
84
-
85
- ```
89
+ ```
90
+
91
+
92
+
86
-
93
+ 上記のロジックを言葉で説明すると、 二つの整数 `a` 、 `b` の比較関数 `compare(a, b)` は、通常ではただ単に `a - b` を返せば済むところを、このご質問の要件を満たすためには、 `a`または`b`が 0 である場合の処理と、 `a`と `b`とが異符号である場合の処理を、 `a - b` を返す前に行う必要がある、ということになります。
87
-
88
-
94
+
95
+
96
+
89
- 上記の考え方で作成したコードが以下です。
97
+ 上記の考え方で作成した `compare(a,b)` が以下です。
90
98
 
91
99
 
92
100
 
@@ -94,17 +102,27 @@
94
102
 
95
103
  const compare = (a, b) => {
96
104
 
105
+
106
+
107
+ // a または b が 0 である場合
108
+
109
+ if ( a === 0 ) return -1;
110
+
97
- if (a * b === 0)
111
+ if ( b === 0 ) return 1;
98
-
112
+
113
+
114
+
99
- return Math.abs(a) - Math.abs(b);
115
+ // a b が異符号の場合
100
-
116
+
101
- else if ( a * b > 0)
117
+ if ( a * b < 0 ) return b;
118
+
119
+
120
+
102
-
121
+ // a と b が同符号の場合
122
+
103
- return a - b;
123
+ return a - b;
104
-
105
- else
124
+
106
-
107
- return b;
125
+
108
126
 
109
127
  };
110
128
 
@@ -126,7 +144,7 @@
126
144
 
127
145
 
128
146
 
129
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3h6aesjz/1/](https://jsfiddle.net/jun68ykt/3h6aesjz/1/)
147
+ **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/fr2snba7/1/](https://jsfiddle.net/jun68ykt/fr2snba7/1/)
130
148
 
131
149
 
132
150
 
@@ -166,7 +184,7 @@
166
184
 
167
185
 
168
186
 
169
- `hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/3h6aesjz/2/](https://jsfiddle.net/jun68ykt/3h6aesjz/2/)
187
+ `hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/fr2snba7/2/](https://jsfiddle.net/jun68ykt/fr2snba7/2/)
170
188
 
171
189
 
172
190
 

16

テキスト修正

2018/09/15 02:26

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
 
66
66
 
67
- 上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。(※上記の配列内には同じ値がないことを考慮して、 `a` と `b` が等しい場合に 0 を返すコードは省略しています。)
67
+ 上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。
68
68
 
69
69
 
70
70
 

15

テキスト修正

2018/09/15 01:55

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  ```
48
48
 
49
- の各要素の `date` プロパティの(文字列を整数に変換した値を引いた差を要素とする配列
49
+ の各要素の `date` プロパティを整数に変換した値を引いた差を要素とする配列
50
50
 
51
51
  ```javascript
52
52
 

14

テキスト修正

2018/09/14 22:59

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -134,7 +134,7 @@
134
134
 
135
135
   
136
136
 
137
- なお上記の比較関数によるソートは、 与えられる配列`hoge` が、 `date`でソートされていなくてたとえば以下
137
+ なお上記の比較関数によるソートは、 与えられる配列`hoge` が、 `date`でソートされていなくても望む結果が得られます。たとえば `hoge` が
138
138
 
139
139
 
140
140
 
@@ -162,7 +162,7 @@
162
162
 
163
163
 
164
164
 
165
- のようなものであっても、望む結果が得られます。そのサンプルが以下です。
165
+ であった場合のサンプルが以下です。
166
166
 
167
167
 
168
168
 

13

テキスト修正

2018/09/14 22:55

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -196,7 +196,7 @@
196
196
 
197
197
 
198
198
 
199
- の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を拝借しますと、基準にする dateが 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
199
+ の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を拝借しますと、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
200
200
 
201
201
 
202
202
 

12

テキスト修正

2018/09/14 22:51

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
9
+ なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
10
10
 
11
11
 
12
12
 
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- では、`baseDate`が 4 ということになります
17
+ では、`baseDate`が 4 ということになります
18
18
 
19
19
 
20
20
 

11

テキスト修正

2018/09/14 22:47

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,15 @@
6
6
 
7
7
 
8
8
 
9
- なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。(ご質問の例では、`baseDate`が 4 ということになります)
9
+ なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。(ご質問の例
10
+
11
+
12
+
13
+ > たとえば任意の値を4としたとき
14
+
15
+
16
+
17
+ では、`baseDate`が 4 ということになります)
10
18
 
11
19
 
12
20
 

10

テキスト修正

2018/09/14 22:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,11 +6,15 @@
6
6
 
7
7
 
8
8
 
9
+ なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。(ご質問の例では、`baseDate`が 4 ということになります)
10
+
11
+
12
+
9
13
  ## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
10
14
 
11
15
 
12
16
 
13
- ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば基準値が `4` であるときは、 `4` から配列`hoge`
17
+ ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば `baseDate` が `4` であるときは、 `4` から配列`hoge`
14
18
 
15
19
  ```javascript
16
20
 
@@ -56,8 +60,6 @@
56
60
 
57
61
 
58
62
 
59
-
60
-
61
63
  ```
62
64
 
63
65
  if ( a か b のいずれかが 0 )
@@ -100,9 +102,9 @@
100
102
 
101
103
 
102
104
 
103
- const sortByBaseDate = (ary, base) =>
105
+ const sortByBaseDate = (ary, baseDate) =>
104
-
106
+
105
- ary.sort((e1,e2) => compare(base - e1.date, base - e2.date));
107
+ ary.sort((e1,e2) => compare(baseDate - e1.date, baseDate - e2.date));
106
108
 
107
109
 
108
110
 
@@ -116,7 +118,7 @@
116
118
 
117
119
 
118
120
 
119
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/ca396q1e/3/](https://jsfiddle.net/jun68ykt/ca396q1e/3/)
121
+ **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3h6aesjz/1/](https://jsfiddle.net/jun68ykt/3h6aesjz/1/)
120
122
 
121
123
 
122
124
 
@@ -156,7 +158,7 @@
156
158
 
157
159
 
158
160
 
159
- `hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/ca396q1e/4/](https://jsfiddle.net/jun68ykt/ca396q1e/4/)
161
+ `hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/3h6aesjz/2/](https://jsfiddle.net/jun68ykt/3h6aesjz/2/)
160
162
 
161
163
 
162
164
 
@@ -192,7 +194,7 @@
192
194
 
193
195
  ```javascript
194
196
 
195
- const rotateByBaseDate = (ary, base) => [...ary].rotate(ary.length - base);
197
+ const rotateByBaseDate = (ary, baseDate) => [...ary].rotate(ary.length - baseDate);
196
198
 
197
199
  ```
198
200
 
@@ -212,7 +214,7 @@
212
214
 
213
215
 
214
216
 
215
- ** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/7/](https://jsfiddle.net/jun68ykt/tycq3g28/7/)
217
+ ** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)
216
218
 
217
219
 
218
220
 

9

テキスト修正

2018/09/14 22:44

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -178,7 +178,7 @@
178
178
 
179
179
 
180
180
 
181
- 上記質問の回答の中で、ベストアンサーになっている
181
+ これのベストアンサーになっている
182
182
 
183
183
 
184
184
 

8

テキスト修正

2018/09/14 21:53

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば基準値が `4` で、`hoge`
13
+ ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば基準値が `4` であるときは `4` から配列`hoge`
14
14
 
15
15
  ```javascript
16
16
 
@@ -34,9 +34,7 @@
34
34
 
35
35
  ```
36
36
 
37
-
38
-
39
- であるときは、`4` から各要素の `date` プロパティの(文字列を整数に変換した)値を引いた差を要素とする配列
37
+ 各要素の `date` プロパティの(文字列を整数に変換した)値を引いた差を要素とする配列
40
38
 
41
39
  ```javascript
42
40
 

7

テキスト修正

2018/09/14 21:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -10,11 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現し
13
+ ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとる場合、たとえば基準値が `4` で、`hoge`が
14
-
15
-
16
-
17
- 基準値が `4` で、`hoge`が
18
14
 
19
15
  ```javascript
20
16
 
@@ -40,7 +36,7 @@
40
36
 
41
37
 
42
38
 
43
- である場合、`4` から各要素の `date` プロパティの(文字列を整数に変換した)値を引いた差を要素とする配列
39
+ であるときは、`4` から各要素の `date` プロパティの(文字列を整数に変換した)値を引いた差を要素とする配列
44
40
 
45
41
  ```javascript
46
42
 

6

テキスト修正

2018/09/14 21:42

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- ## (1) sort で実現する
9
+ ## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う
10
10
 
11
11
 
12
12
 

5

テキスト修正

2018/09/14 21:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -116,7 +116,7 @@
116
116
 
117
117
 
118
118
 
119
- 上記のように、 `compare` と `sortByBaseDate` を作ると、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
119
+ 上記のように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
120
120
 
121
121
 
122
122
 

4

テキスト修正

2018/09/14 21:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -214,7 +214,7 @@
214
214
 
215
215
 
216
216
 
217
- 上記の `rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました。
217
+ 上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました。
218
218
 
219
219
 
220
220
 

3

テキスト修正

2018/09/14 21:24

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -214,7 +214,7 @@
214
214
 
215
215
 
216
216
 
217
- 以下は、上記の `rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルです
217
+ 上記の `rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました
218
218
 
219
219
 
220
220
 

2

テキスト修正

2018/09/14 21:23

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 以下、2つの異なる考え方、方法による回答になります。
5
+ 以下、異なる考え方、方法による2つの方法を回答ます。
6
6
 
7
7
 
8
8
 

1

テキスト修正

2018/09/14 21:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
 
60
60
 
61
- 上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。
61
+ 上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。(※上記の配列内には同じ値がないことを考慮して、 `a` と `b` が等しい場合に 0 を返すコードは省略しています。)
62
62
 
63
63
 
64
64