回答編集履歴
36
テキスト修正
answer
CHANGED
@@ -182,4 +182,4 @@
|
|
182
182
|
```
|
183
183
|
**サンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/16/](https://jsfiddle.net/jun68ykt/tycq3g28/16/)
|
184
184
|
|
185
|
-
上記の `slice` と `concat`を使った `orderBy` で事足りるということだと、
|
185
|
+
上記の `slice` と `concat`を使った `orderBy` で事足りるということだと、sort させたり、 rotateさせたりといった込み入ったことをする必要はありませんでした。あとは、もともと `hoge`が date でソートされているかどうか、といった要件しだいで、お好みの方法を比較検討して頂ければと思います。
|
35
テキスト修正
answer
CHANGED
@@ -115,7 +115,7 @@
|
|
115
115
|
|
116
116
|
---
|
117
117
|
|
118
|
-
**追記**
|
118
|
+
**追記1**
|
119
119
|
|
120
120
|
長々と 回答(1)、(2)を書いてしまいましたが、もう少し見通しのいいコードで書けたので以下に追記します。
|
121
121
|
|
@@ -160,4 +160,26 @@
|
|
160
160
|
|
161
161
|
以下、この `orderBy` を使ったサンプルです。
|
162
162
|
|
163
|
-
[https://jsfiddle.net/jun68ykt/tycq3g28/15/](https://jsfiddle.net/jun68ykt/tycq3g28/15/)
|
163
|
+
[https://jsfiddle.net/jun68ykt/tycq3g28/15/](https://jsfiddle.net/jun68ykt/tycq3g28/15/)
|
164
|
+
|
165
|
+
|
166
|
+
---
|
167
|
+
|
168
|
+
**追記2**
|
169
|
+
|
170
|
+
上記、追記1 の `orderBy` は、以下のようにも書けます。
|
171
|
+
|
172
|
+
```javascript
|
173
|
+
hoge.orderBy = function(baseDate) {
|
174
|
+
|
175
|
+
if ( 1 <= baseDate && baseDate < this.length )
|
176
|
+
return this.slice(this.length - baseDate)
|
177
|
+
.concat(this.slice(0, this.length - baseDate));
|
178
|
+
|
179
|
+
return [...this];
|
180
|
+
|
181
|
+
};
|
182
|
+
```
|
183
|
+
**サンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/16/](https://jsfiddle.net/jun68ykt/tycq3g28/16/)
|
184
|
+
|
185
|
+
上記の `slice` と `concat`を使った `orderBy` で事足りるということだと、ソートするとか rotateさせるとか、ちょっと込み入ったことをする必要はありませんでしたね。
|
34
テキスト修正
answer
CHANGED
@@ -135,14 +135,12 @@
|
|
135
135
|
|
136
136
|
```
|
137
137
|
hoge.orderBy = function(baseDate) {
|
138
|
-
|
138
|
+
const that = [...this];
|
139
|
+
|
139
|
-
if ( 1 <= baseDate && baseDate < this.length )
|
140
|
+
if ( 1 <= baseDate && baseDate < this.length )
|
140
|
-
that = [...this];
|
141
|
-
for ( i = 0; i < this.length - baseDate; ++ i )
|
141
|
+
for ( i = 0; i < this.length - baseDate; ++ i )
|
142
|
-
that.push(that.shift())
|
142
|
+
that.push(that.shift());
|
143
|
-
|
143
|
+
|
144
|
-
that = this;
|
145
|
-
}
|
146
144
|
return that;
|
147
145
|
};
|
148
146
|
```
|
@@ -162,4 +160,4 @@
|
|
162
160
|
|
163
161
|
以下、この `orderBy` を使ったサンプルです。
|
164
162
|
|
165
|
-
[https://jsfiddle.net/jun68ykt/tycq3g28/
|
163
|
+
[https://jsfiddle.net/jun68ykt/tycq3g28/15/](https://jsfiddle.net/jun68ykt/tycq3g28/15/)
|
33
テキスト修正
answer
CHANGED
@@ -110,4 +110,56 @@
|
|
110
110
|
|
111
111
|
なお、`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、 `rotateByBaseDate(hoge, 5)` としたときに、望ましい結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
|
112
112
|
|
113
|
-
以上、参考になれば幸いです。
|
113
|
+
以上、参考になれば幸いです。
|
114
|
+
|
115
|
+
|
116
|
+
---
|
117
|
+
|
118
|
+
**追記**
|
119
|
+
|
120
|
+
長々と 回答(1)、(2)を書いてしまいましたが、もう少し見通しのいいコードで書けたので以下に追記します。
|
121
|
+
|
122
|
+
配列 `hoge`
|
123
|
+
```javascript
|
124
|
+
const hoge = [
|
125
|
+
{ date:"7", status:"C" },
|
126
|
+
{ date:"6", status:"B" },
|
127
|
+
{ date:"5", status:"D" },
|
128
|
+
{ date:"4", status:"B" },
|
129
|
+
{ date:"3", status:"A" },
|
130
|
+
{ date:"2", status:"C" },
|
131
|
+
{ date:"1", status:"A" }
|
132
|
+
];
|
133
|
+
```
|
134
|
+
に以下のようなメソッドを追加します。
|
135
|
+
|
136
|
+
```
|
137
|
+
hoge.orderBy = function(baseDate) {
|
138
|
+
let that;
|
139
|
+
if ( 1 <= baseDate && baseDate < this.length ) {
|
140
|
+
that = [...this];
|
141
|
+
for ( i = 0; i < this.length - baseDate; ++ i )
|
142
|
+
that.push(that.shift())
|
143
|
+
} else {
|
144
|
+
that = this;
|
145
|
+
}
|
146
|
+
return that;
|
147
|
+
};
|
148
|
+
```
|
149
|
+
|
150
|
+
この `orderBy` を使うことで、たとえば `baseDate` に 4 を指定して並べ替えた配列 `hoge4` を得るには、
|
151
|
+
|
152
|
+
```javascript
|
153
|
+
const hoge4 = hoge.orderBy(4);
|
154
|
+
```
|
155
|
+
|
156
|
+
とすればよいです。この`orderBy`は、 `hoge` の順序は変更しないので、続けて
|
157
|
+
```javascript
|
158
|
+
const hoge2 = hoge.orderBy(2);
|
159
|
+
```
|
160
|
+
などとしても、望ましい結果が返ります。
|
161
|
+
|
162
|
+
|
163
|
+
以下、この `orderBy` を使ったサンプルです。
|
164
|
+
|
165
|
+
[https://jsfiddle.net/jun68ykt/tycq3g28/11/](https://jsfiddle.net/jun68ykt/tycq3g28/11/)
|
32
テキスト修正
answer
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
{ date:"1", status:"A" }
|
23
23
|
];
|
24
24
|
```
|
25
|
-
の各要素の `date` プロパティを整数に変換した値を引いた差
|
25
|
+
の各要素の `date` プロパティ (を整数に変換した値) を引いた差の配列
|
26
26
|
```javascript
|
27
27
|
[-3, -2, -1, 0, 1, 2, 3]; // = [ 4-"7", 4-"6", 4-"5", 4-"4", 4-"3", 4-"2", 4-"1" ]
|
28
28
|
```
|
31
テキスト修正
answer
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
```
|
25
25
|
の各要素の `date` プロパティを整数に変換した値を引いた差を要素とする配列
|
26
26
|
```javascript
|
27
|
-
[-3, -2, -1, 0, 1, 2, 3];
|
27
|
+
[-3, -2, -1, 0, 1, 2, 3]; // = [ 4-"7", 4-"6", 4-"5", 4-"4", 4-"3", 4-"2", 4-"1" ]
|
28
28
|
```
|
29
29
|
を、以下のように並び替えるにはどうしたらいいか? という問題に帰着します。
|
30
30
|
```javascript
|
30
テキスト修正
answer
CHANGED
@@ -63,8 +63,7 @@
|
|
63
63
|
|
64
64
|
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/6zqrL49a/1/](https://jsfiddle.net/jun68ykt/6zqrL49a/1/)
|
65
65
|
|
66
|
-
|
67
|
-
|
66
|
+
|
68
67
|
なお上記の比較関数によるソートは、 与えられる配列`hoge` が、 `date`でソートされていなくても望む結果が得られます。たとえば `hoge` が
|
69
68
|
|
70
69
|
```javascript
|
29
テキスト修正
answer
CHANGED
@@ -61,7 +61,7 @@
|
|
61
61
|
このように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` によって、`hoge` が望ましい状態に並び替えられます。
|
62
62
|
|
63
63
|
|
64
|
-
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/6zqrL49a/1/](https://jsfiddle.net/jun68ykt/6zqrL49a/1/)
|
64
|
+
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/6zqrL49a/1/](https://jsfiddle.net/jun68ykt/6zqrL49a/1/)
|
65
65
|
|
66
66
|
|
67
67
|
|
@@ -81,7 +81,7 @@
|
|
81
81
|
|
82
82
|
であった場合のサンプルが以下です。
|
83
83
|
|
84
|
-
`hoge` **が ** `date` **でソートされていない例:**[https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
|
84
|
+
- `hoge` **が ** `date` **でソートされていない例:**[https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
|
85
85
|
|
86
86
|
|
87
87
|
## (2) 配列の回転(rotate)を使う
|
@@ -103,11 +103,11 @@
|
|
103
103
|
```
|
104
104
|
|
105
105
|
を作っておいて、 `rotateByBaseDate(hoge, 4)` とすれば望む配列が得られます。
|
106
|
-
以下
|
106
|
+
以下、サンプルを作成しました。
|
107
107
|
|
108
|
-
** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)
|
108
|
+
- ** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)
|
109
109
|
|
110
|
-
上記のコードでは、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えます。
|
110
|
+
上記のコードでは、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えます。
|
111
111
|
|
112
112
|
なお、`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、 `rotateByBaseDate(hoge, 5)` としたときに、望ましい結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
|
113
113
|
|
28
テキスト修正
answer
CHANGED
@@ -86,9 +86,9 @@
|
|
86
86
|
|
87
87
|
## (2) 配列の回転(rotate)を使う
|
88
88
|
|
89
|
-
上記の回答(1) は、与えられる配列`hoge` が date でソートされていなくても望
|
89
|
+
上記の回答(1) は、初めに与えられる配列`hoge` が date でソートされていなくても望ましい結果を得るための回答でしたが、前提条件として`hoge`の要素は`date`の降順にソートされているとするならば、配列 `hoge` を回転(rotate)させた配列を作るにはどうしたらいいか?という問題と考えることができます。
|
90
90
|
|
91
|
-
配列をrotateさせるためのコードは、以下の質問の回答に挙げられています。
|
91
|
+
配列を回転(rotate)させるためのコードは、以下の質問の回答に挙げられています。
|
92
92
|
|
93
93
|
- stackoverflow.com: [JavaScript Array rotate()](https://stackoverflow.com/questions/1985260/javascript-array-rotate)
|
94
94
|
|
@@ -96,22 +96,19 @@
|
|
96
96
|
|
97
97
|
[https://stackoverflow.com/a/1985471](https://stackoverflow.com/a/1985471)
|
98
98
|
|
99
|
-
の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) をお借りして、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
|
99
|
+
の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) をお借りすることにして、たとえば、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
|
100
100
|
|
101
101
|
```javascript
|
102
102
|
const rotateByBaseDate = (ary, baseDate) => [...ary].rotate(ary.length - baseDate);
|
103
103
|
```
|
104
104
|
|
105
105
|
を作っておいて、 `rotateByBaseDate(hoge, 4)` とすれば望む配列が得られます。
|
106
|
-
|
107
|
-
なお、上記のコードで`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、たとえば `rotateByBaseDate(hoge, 5)` とすると望む結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
|
106
|
+
以下に、この `rotateByBaseDate` を使うサンプルコードを作成しました。
|
108
107
|
|
109
|
-
|
110
|
-
上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えるサンプルを以下に作成しました。
|
111
|
-
|
112
108
|
** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)
|
113
109
|
|
110
|
+
上記のコードでは、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えます。
|
114
111
|
|
115
|
-
|
112
|
+
なお、`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、 `rotateByBaseDate(hoge, 5)` としたときに、望ましい結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
|
116
113
|
|
117
114
|
以上、参考になれば幸いです。
|
27
テキスト修正
answer
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
このご質問でeeengineeeeeeerさんが要望されている並べ替えを実現するために、異なる2つのアプローチがあると思いましたので、それぞれ以下の(1)、(2)として回答します。
|
4
4
|
|
5
|
-
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
|
5
|
+
なお、以下の回答では、並べ替えた結果、先頭にくるべき要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
|
6
6
|
|
7
7
|
> たとえば任意の値を4としたとき
|
8
8
|
|
9
|
-
では、`baseDate`
|
9
|
+
では、`baseDate`として 4 を指定する、ということになります。
|
10
10
|
|
11
11
|
## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
|
12
12
|
|
26
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは。
|
2
2
|
|
3
|
-
このご質問でeeengineeeeeeerさんが要望されている並べ替えを実現するために、異なる2つのアプローチがあると思いました
|
3
|
+
このご質問でeeengineeeeeeerさんが要望されている並べ替えを実現するために、異なる2つのアプローチがあると思いましたので、それぞれ以下の(1)、(2)として回答します。
|
4
4
|
|
5
5
|
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
|
6
6
|
|
25
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは。
|
2
2
|
|
3
|
-
|
3
|
+
このご質問でeeengineeeeeeerさんが要望されている並べ替えを実現するために、異なる2つのアプローチがあると思いました。それを以下の(1)、(2) で回答します。
|
4
4
|
|
5
5
|
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
|
6
6
|
|
24
テキスト修正
answer
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
## (2) 配列の回転(rotate)を使う
|
88
88
|
|
89
|
-
上記の回答(1) は、与えられる配列`hoge` が date でソートされていなくても望む結果を得るための回答でしたが、`hoge`の要素が`date`の降順にソートされていることは前提条件であるならば、配列を回転(rotate)させ
|
89
|
+
上記の回答(1) は、与えられる配列`hoge` が date でソートされていなくても望む結果を得るための回答でしたが、`hoge`の要素が`date`の降順にソートされていることは前提条件であるならば、配列 `hoge` を回転(rotate)させた配列を作るにはどうしたらいいか?という問題と考えることができます。
|
90
90
|
|
91
91
|
配列をrotateさせるためのコードは、以下の質問の回答に挙げられています。
|
92
92
|
|
@@ -96,7 +96,7 @@
|
|
96
96
|
|
97
97
|
[https://stackoverflow.com/a/1985471](https://stackoverflow.com/a/1985471)
|
98
98
|
|
99
|
-
の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を
|
99
|
+
の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) をお借りして、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
|
100
100
|
|
101
101
|
```javascript
|
102
102
|
const rotateByBaseDate = (ary, baseDate) => [...ary].rotate(ary.length - baseDate);
|
23
テキスト修正
answer
CHANGED
@@ -107,7 +107,7 @@
|
|
107
107
|
なお、上記のコードで`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、たとえば `rotateByBaseDate(hoge, 5)` とすると望む結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
|
108
108
|
|
109
109
|
|
110
|
-
上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに
|
110
|
+
上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに `baseDate` を 4 として並べ替え、次に 5 で並べ替えるサンプルを以下に作成しました。
|
111
111
|
|
112
112
|
** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)
|
113
113
|
|
22
テキスト修正
answer
CHANGED
@@ -81,7 +81,7 @@
|
|
81
81
|
|
82
82
|
であった場合のサンプルが以下です。
|
83
83
|
|
84
|
-
|
84
|
+
`hoge` **が ** `date` **でソートされていない例:**[https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
|
85
85
|
|
86
86
|
|
87
87
|
## (2) 配列の回転(rotate)を使う
|
21
テキスト修正
answer
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
[0, 1, 2, 3, -3, -2, -1];
|
32
32
|
```
|
33
33
|
|
34
|
-
上記のようなソートを行うための比較関数 `compare(a, b)` の一例が以下です。(他の書き方もある
|
34
|
+
上記のようなソートを行うための比較関数 `compare(a, b)` の一例が以下です。(他のより良い書き方もあるかもしれません。)
|
35
35
|
|
36
36
|
```javascript
|
37
37
|
const compare = (a, b) => {
|
20
テキスト修正
answer
CHANGED
@@ -58,10 +58,10 @@
|
|
58
58
|
ary.sort((e1,e2) => compare(baseDate - e1.date, baseDate - e2.date));
|
59
59
|
```
|
60
60
|
|
61
|
-
このように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)`
|
61
|
+
このように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` によって、`hoge` が望ましい状態に並び替えられます。
|
62
62
|
|
63
63
|
|
64
|
-
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/
|
64
|
+
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/6zqrL49a/1/](https://jsfiddle.net/jun68ykt/6zqrL49a/1/)
|
65
65
|
|
66
66
|
|
67
67
|
|
@@ -81,7 +81,7 @@
|
|
81
81
|
|
82
82
|
であった場合のサンプルが以下です。
|
83
83
|
|
84
|
-
`hoge` **が
|
84
|
+
初めに与えられる`hoge` **が ** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/6zqrL49a/2/](https://jsfiddle.net/jun68ykt/6zqrL49a/2/)
|
85
85
|
|
86
86
|
|
87
87
|
## (2) 配列の回転(rotate)を使う
|
19
テキスト修正
answer
CHANGED
@@ -31,25 +31,8 @@
|
|
31
31
|
[0, 1, 2, 3, -3, -2, -1];
|
32
32
|
```
|
33
33
|
|
34
|
-
上記のようなソートを行うための比較関数 `compare(a, b)`
|
34
|
+
上記のようなソートを行うための比較関数 `compare(a, b)` の一例が以下です。(他の書き方もあるでしょう。)
|
35
35
|
|
36
|
-
```
|
37
|
-
if ( a が 0 )
|
38
|
-
負の数を返す。
|
39
|
-
|
40
|
-
if ( b が 0 )
|
41
|
-
正の数を返す。
|
42
|
-
|
43
|
-
if ( a と b は異符号 )
|
44
|
-
b が負の数なら、負の数を返し、そうでないなら正の数を返す。
|
45
|
-
|
46
|
-
上記以外であれば、 a - b を返す。
|
47
|
-
```
|
48
|
-
|
49
|
-
上記のロジックを言葉で説明すると、 二つの整数 `a` 、 `b` の比較関数 `compare(a, b)` は、通常ではただ単に `a - b` を返せば済むところを、このご質問の要件を満たすためには、 `a`または`b`が 0 である場合の処理と、 `a`と `b`とが異符号である場合の処理を、 `a - b` を返す前に行う必要がある、ということになります。
|
50
|
-
|
51
|
-
上記の考え方で作成した `compare(a,b)` が以下です。
|
52
|
-
|
53
36
|
```javascript
|
54
37
|
const compare = (a, b) => {
|
55
38
|
|
@@ -64,13 +47,18 @@
|
|
64
47
|
return a - b;
|
65
48
|
|
66
49
|
};
|
50
|
+
```
|
67
51
|
|
52
|
+
上記のロジックを言葉で説明すると、 二つの整数 `a` 、 `b` の比較関数 `compare(a, b)` は、通常ではただ単に `a - b` を返せば済むところを、このご質問の要件を満たすためには、 `a`または`b`が 0 である場合の処理と、 `a`と `b`とが異符号である場合の処理を、 `a - b` を返す前に行う必要がある、ということになります。
|
53
|
+
|
54
|
+
この `compare(a,b)` を使うことで、ソート対象の配列 `ary` (hoge が与えられる想定) と、 `baseDate`を引数として取り、望ましい順序で並べ替えた配列を返す関数 `sortByBaseDate(ary, baseDate)` を以下のように書けます。
|
55
|
+
|
56
|
+
```javascript
|
68
57
|
const sortByBaseDate = (ary, baseDate) =>
|
69
58
|
ary.sort((e1,e2) => compare(baseDate - e1.date, baseDate - e2.date));
|
70
|
-
|
71
59
|
```
|
72
60
|
|
73
|
-
|
61
|
+
このように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
|
74
62
|
|
75
63
|
|
76
64
|
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/fr2snba7/1/](https://jsfiddle.net/jun68ykt/fr2snba7/1/)
|
18
テキスト修正
answer
CHANGED
@@ -36,12 +36,14 @@
|
|
36
36
|
```
|
37
37
|
if ( a が 0 )
|
38
38
|
負の数を返す。
|
39
|
+
|
39
|
-
|
40
|
+
if ( b が 0 )
|
40
41
|
正の数を返す。
|
42
|
+
|
41
|
-
|
43
|
+
if ( a と b は異符号 )
|
42
44
|
b が負の数なら、負の数を返し、そうでないなら正の数を返す。
|
43
|
-
|
45
|
+
|
44
|
-
|
46
|
+
上記以外であれば、 a - b を返す。
|
45
47
|
```
|
46
48
|
|
47
49
|
上記のロジックを言葉で説明すると、 二つの整数 `a` 、 `b` の比較関数 `compare(a, b)` は、通常ではただ単に `a - b` を返せば済むところを、このご質問の要件を満たすためには、 `a`または`b`が 0 である場合の処理と、 `a`と `b`とが異符号である場合の処理を、 `a - b` を返す前に行う必要がある、ということになります。
|
17
テキスト修正
answer
CHANGED
@@ -34,24 +34,33 @@
|
|
34
34
|
上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。
|
35
35
|
|
36
36
|
```
|
37
|
-
if ( a
|
37
|
+
if ( a が 0 )
|
38
|
+
負の数を返す。
|
38
|
-
|
39
|
+
else if ( b が 0 )
|
40
|
+
正の数を返す。
|
39
|
-
else if ( a と b
|
41
|
+
else if ( a と b は異符号 )
|
42
|
+
b が負の数なら、負の数を返し、そうでないなら正の数を返す。
|
43
|
+
else /* a と b とは同符号 */
|
40
44
|
a - b を返す。
|
41
|
-
else
|
42
|
-
b が負の数なら、負の数を返し、そうでないなら正の数を返す。
|
43
45
|
```
|
44
46
|
|
45
|
-
上記の
|
47
|
+
上記のロジックを言葉で説明すると、 二つの整数 `a` 、 `b` の比較関数 `compare(a, b)` は、通常ではただ単に `a - b` を返せば済むところを、このご質問の要件を満たすためには、 `a`または`b`が 0 である場合の処理と、 `a`と `b`とが異符号である場合の処理を、 `a - b` を返す前に行う必要がある、ということになります。
|
46
48
|
|
49
|
+
上記の考え方で作成した `compare(a,b)` が以下です。
|
50
|
+
|
47
51
|
```javascript
|
48
52
|
const compare = (a, b) => {
|
53
|
+
|
54
|
+
// a または b が 0 である場合
|
55
|
+
if ( a === 0 ) return -1;
|
49
|
-
if (
|
56
|
+
if ( b === 0 ) return 1;
|
57
|
+
|
50
|
-
|
58
|
+
// a と b が異符号の場合
|
51
|
-
|
59
|
+
if ( a * b < 0 ) return b;
|
60
|
+
|
61
|
+
// a と b が同符号の場合
|
52
|
-
|
62
|
+
return a - b;
|
53
|
-
|
63
|
+
|
54
|
-
return b;
|
55
64
|
};
|
56
65
|
|
57
66
|
const sortByBaseDate = (ary, baseDate) =>
|
@@ -62,7 +71,7 @@
|
|
62
71
|
上記のように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
|
63
72
|
|
64
73
|
|
65
|
-
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/
|
74
|
+
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/fr2snba7/1/](https://jsfiddle.net/jun68ykt/fr2snba7/1/)
|
66
75
|
|
67
76
|
|
68
77
|
|
@@ -82,7 +91,7 @@
|
|
82
91
|
|
83
92
|
であった場合のサンプルが以下です。
|
84
93
|
|
85
|
-
`hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/
|
94
|
+
`hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/fr2snba7/2/](https://jsfiddle.net/jun68ykt/fr2snba7/2/)
|
86
95
|
|
87
96
|
|
88
97
|
## (2) 配列の回転(rotate)を使う
|
16
テキスト修正
answer
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
[0, 1, 2, 3, -3, -2, -1];
|
32
32
|
```
|
33
33
|
|
34
|
-
上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。
|
34
|
+
上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。
|
35
35
|
|
36
36
|
```
|
37
37
|
if ( a か b のいずれかが 0 )
|
15
テキスト修正
answer
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
{ date:"1", status:"A" }
|
23
23
|
];
|
24
24
|
```
|
25
|
-
の各要素の `date` プロパティ
|
25
|
+
の各要素の `date` プロパティを整数に変換した値を引いた差を要素とする配列
|
26
26
|
```javascript
|
27
27
|
[-3, -2, -1, 0, 1, 2, 3];
|
28
28
|
```
|
14
テキスト修正
answer
CHANGED
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
|
68
68
|
|
69
|
-
なお上記の比較関数によるソートは、 与えられる配列`hoge` が、 `date`でソートされていなくて
|
69
|
+
なお上記の比較関数によるソートは、 与えられる配列`hoge` が、 `date`でソートされていなくても望む結果が得られます。たとえば `hoge` が
|
70
70
|
|
71
71
|
```javascript
|
72
72
|
const hoge = [
|
@@ -80,7 +80,7 @@
|
|
80
80
|
];
|
81
81
|
```
|
82
82
|
|
83
|
-
|
83
|
+
であった場合のサンプルが以下です。
|
84
84
|
|
85
85
|
`hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/3h6aesjz/2/](https://jsfiddle.net/jun68ykt/3h6aesjz/2/)
|
86
86
|
|
13
テキスト修正
answer
CHANGED
@@ -97,7 +97,7 @@
|
|
97
97
|
|
98
98
|
[https://stackoverflow.com/a/1985471](https://stackoverflow.com/a/1985471)
|
99
99
|
|
100
|
-
の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を拝借しますと、
|
100
|
+
の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を拝借しますと、`baseDate`が 4 の場合は、`hoge` の要素の中で date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
|
101
101
|
|
102
102
|
```javascript
|
103
103
|
const rotateByBaseDate = (ary, baseDate) => [...ary].rotate(ary.length - baseDate);
|
12
テキスト修正
answer
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
以下、異なる考え方、方法による2つの方法を回答します。
|
4
4
|
|
5
|
-
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。
|
5
|
+
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。ご質問の例:
|
6
6
|
|
7
7
|
> たとえば任意の値を4としたとき
|
8
8
|
|
9
|
-
では、`baseDate`が 4 ということになります
|
9
|
+
では、`baseDate`が 4 ということになります。
|
10
10
|
|
11
11
|
## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
|
12
12
|
|
11
テキスト修正
answer
CHANGED
@@ -2,8 +2,12 @@
|
|
2
2
|
|
3
3
|
以下、異なる考え方、方法による2つの方法を回答します。
|
4
4
|
|
5
|
-
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。(ご質問の例
|
5
|
+
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。(ご質問の例:
|
6
6
|
|
7
|
+
> たとえば任意の値を4としたとき
|
8
|
+
|
9
|
+
では、`baseDate`が 4 ということになります)
|
10
|
+
|
7
11
|
## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
|
8
12
|
|
9
13
|
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば `baseDate` が `4` であるときは、 `4` から配列`hoge`
|
10
テキスト修正
answer
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
|
3
3
|
以下、異なる考え方、方法による2つの方法を回答します。
|
4
4
|
|
5
|
+
なお、以下の回答では、並べ替えた結果、先頭にくる要素の`date` プロパティに相当する整数値を、 `baseDate` という変数名で表します。(ご質問の例では、`baseDate`が 4 ということになります)
|
6
|
+
|
5
7
|
## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
|
6
8
|
|
7
|
-
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば
|
9
|
+
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば `baseDate` が `4` であるときは、 `4` から配列`hoge`
|
8
10
|
```javascript
|
9
11
|
const hoge = [
|
10
12
|
{ date:"7", status:"C" },
|
@@ -27,7 +29,6 @@
|
|
27
29
|
|
28
30
|
上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。(※上記の配列内には同じ値がないことを考慮して、 `a` と `b` が等しい場合に 0 を返すコードは省略しています。)
|
29
31
|
|
30
|
-
|
31
32
|
```
|
32
33
|
if ( a か b のいずれかが 0 )
|
33
34
|
a が0ならば負の数を返し、 そうでないなら正の数を返す。
|
@@ -49,15 +50,15 @@
|
|
49
50
|
return b;
|
50
51
|
};
|
51
52
|
|
52
|
-
const sortByBaseDate = (ary,
|
53
|
+
const sortByBaseDate = (ary, baseDate) =>
|
53
|
-
ary.sort((e1,e2) => compare(
|
54
|
+
ary.sort((e1,e2) => compare(baseDate - e1.date, baseDate - e2.date));
|
54
55
|
|
55
56
|
```
|
56
57
|
|
57
58
|
上記のように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
|
58
59
|
|
59
60
|
|
60
|
-
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/
|
61
|
+
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3h6aesjz/1/](https://jsfiddle.net/jun68ykt/3h6aesjz/1/)
|
61
62
|
|
62
63
|
|
63
64
|
|
@@ -77,7 +78,7 @@
|
|
77
78
|
|
78
79
|
のようなものであっても、望む結果が得られます。そのサンプルが以下です。
|
79
80
|
|
80
|
-
`hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/
|
81
|
+
`hoge` **が、** `date` **でソートされていない例:** [https://jsfiddle.net/jun68ykt/3h6aesjz/2/](https://jsfiddle.net/jun68ykt/3h6aesjz/2/)
|
81
82
|
|
82
83
|
|
83
84
|
## (2) 配列の回転(rotate)を使う
|
@@ -95,7 +96,7 @@
|
|
95
96
|
の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) を拝借しますと、基準にする dateが 4 の場合は、`hoge` の要素の中で、 date が "4"である要素を先頭にもってくるために、3回 rotate すればよいので、
|
96
97
|
|
97
98
|
```javascript
|
98
|
-
const rotateByBaseDate = (ary,
|
99
|
+
const rotateByBaseDate = (ary, baseDate) => [...ary].rotate(ary.length - baseDate);
|
99
100
|
```
|
100
101
|
|
101
102
|
を作っておいて、 `rotateByBaseDate(hoge, 4)` とすれば望む配列が得られます。
|
@@ -105,7 +106,7 @@
|
|
105
106
|
|
106
107
|
上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました。
|
107
108
|
|
108
|
-
** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/
|
109
|
+
** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/8/](https://jsfiddle.net/jun68ykt/tycq3g28/8/)
|
109
110
|
|
110
111
|
|
111
112
|
|
9
テキスト修正
answer
CHANGED
@@ -88,7 +88,7 @@
|
|
88
88
|
|
89
89
|
- stackoverflow.com: [JavaScript Array rotate()](https://stackoverflow.com/questions/1985260/javascript-array-rotate)
|
90
90
|
|
91
|
-
|
91
|
+
これのベストアンサーになっている
|
92
92
|
|
93
93
|
[https://stackoverflow.com/a/1985471](https://stackoverflow.com/a/1985471)
|
94
94
|
|
8
テキスト修正
answer
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
|
6
6
|
|
7
|
-
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば基準値が `4` で、`hoge`
|
7
|
+
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば基準値が `4` であるときは、 `4` から配列`hoge`
|
8
8
|
```javascript
|
9
9
|
const hoge = [
|
10
10
|
{ date:"7", status:"C" },
|
@@ -16,8 +16,7 @@
|
|
16
16
|
{ date:"1", status:"A" }
|
17
17
|
];
|
18
18
|
```
|
19
|
-
|
20
|
-
|
19
|
+
の各要素の `date` プロパティの(文字列を整数に変換した)値を引いた差を要素とする配列
|
21
20
|
```javascript
|
22
21
|
[-3, -2, -1, 0, 1, 2, 3];
|
23
22
|
```
|
7
テキスト修正
answer
CHANGED
@@ -4,9 +4,7 @@
|
|
4
4
|
|
5
5
|
## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
|
6
6
|
|
7
|
-
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現し
|
7
|
+
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現しようとする場合、たとえば基準値が `4` で、`hoge`が
|
8
|
-
|
9
|
-
基準値が `4` で、`hoge`が
|
10
8
|
```javascript
|
11
9
|
const hoge = [
|
12
10
|
{ date:"7", status:"C" },
|
@@ -19,7 +17,7 @@
|
|
19
17
|
];
|
20
18
|
```
|
21
19
|
|
22
|
-
である
|
20
|
+
であるときは、`4` から各要素の `date` プロパティの(文字列を整数に変換した)値を引いた差を要素とする配列
|
23
21
|
```javascript
|
24
22
|
[-3, -2, -1, 0, 1, 2, 3];
|
25
23
|
```
|
6
テキスト修正
answer
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
以下、異なる考え方、方法による2つの方法を回答します。
|
4
4
|
|
5
|
-
## (1) sort
|
5
|
+
## (1) [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) を使う。
|
6
6
|
|
7
7
|
ご質問の並べ替えを [Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) で実現します。
|
8
8
|
|
5
テキスト修正
answer
CHANGED
@@ -57,7 +57,7 @@
|
|
57
57
|
|
58
58
|
```
|
59
59
|
|
60
|
-
上記のように、 `compare` と `sortByBaseDate` を
|
60
|
+
上記のように、 `compare` と `sortByBaseDate` を用意しておくと、 `sortByBaseDate(hoge, 4)` で望む配列が得られます。
|
61
61
|
|
62
62
|
|
63
63
|
**動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/ca396q1e/3/](https://jsfiddle.net/jun68ykt/ca396q1e/3/)
|
4
テキスト修正
answer
CHANGED
@@ -106,7 +106,7 @@
|
|
106
106
|
なお、上記のコードで`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、たとえば `rotateByBaseDate(hoge, 5)` とすると望む結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
|
107
107
|
|
108
108
|
|
109
|
-
上記の `rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました。
|
109
|
+
上記の [Array.prototype.rotate](https://stackoverflow.com/a/1985471) と`rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました。
|
110
110
|
|
111
111
|
** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/7/](https://jsfiddle.net/jun68ykt/tycq3g28/7/)
|
112
112
|
|
3
テキスト修正
answer
CHANGED
@@ -106,7 +106,7 @@
|
|
106
106
|
なお、上記のコードで`[...ary]`としているところを、単に `ary` としてしまうと、 `rotateByBaseDate(hoge, 4)` としたときに `hoge`自体が変更されてしまって、引き続き、たとえば `rotateByBaseDate(hoge, 5)` とすると望む結果にならなくなってしまうので、これを避けるために`[...ary]` として `ary` のコピーに対して [Array.prototype.rotate](https://stackoverflow.com/a/1985471)を使っています。
|
107
107
|
|
108
108
|
|
109
|
-
|
109
|
+
上記の `rotateByBaseDate` を使って、初めに 基準値 "4" で並べ替え、次に基準値 "5" で並べ替えるサンプルを以下に作成しました。
|
110
110
|
|
111
111
|
** 配列をrotateさせるサンプル: ** [https://jsfiddle.net/jun68ykt/tycq3g28/7/](https://jsfiddle.net/jun68ykt/tycq3g28/7/)
|
112
112
|
|
2
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは。
|
2
2
|
|
3
|
-
以下、
|
3
|
+
以下、異なる考え方、方法による2つの方法を回答します。
|
4
4
|
|
5
5
|
## (1) sort で実現する。
|
6
6
|
|
1
テキスト修正
answer
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
[0, 1, 2, 3, -3, -2, -1];
|
29
29
|
```
|
30
30
|
|
31
|
-
上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。
|
31
|
+
上記のようなソートを行うための比較関数 `compare(a, b)` は、以下を満たせばよいです。(※上記の配列内には同じ値がないことを考慮して、 `a` と `b` が等しい場合に 0 を返すコードは省略しています。)
|
32
32
|
|
33
33
|
|
34
34
|
```
|