回答編集履歴

18

テキスト修正

2018/06/02 22:50

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -150,7 +150,7 @@
150
150
 
151
151
  「追加された要素の配列と、削除された要素の配列を同時に作る」というのが与件ですが、
152
152
 
153
- 私見としましては、より**”同時に”** のあるコードは、以下のようなものになります。
153
+ 私見としましては、より**”同時に”** (?)のあるコードは、以下のようなものになります。
154
154
 
155
155
 
156
156
 

17

テキスト修正

2018/06/02 22:50

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -139,3 +139,57 @@
139
139
  とあるので、上記の方法、すなわち、別々に抽出する方法のリファクタ案のひとつとして
140
140
 
141
141
  お考え頂ければと思います。
142
+
143
+
144
+
145
+ ---
146
+
147
+ **補足3**
148
+
149
+
150
+
151
+ 「追加された要素の配列と、削除された要素の配列を同時に作る」というのが与件ですが、
152
+
153
+ 私見としましては、より**”同時に”** 感のあるコードは、以下のようなものになります。
154
+
155
+
156
+
157
+
158
+
159
+ ```javascript
160
+
161
+ const _ = require('lodash');
162
+
163
+
164
+
165
+ const diff = (x, y) => {
166
+
167
+ const promises =
168
+
169
+ [[y, x], [x, y]].map(e =>
170
+
171
+ new Promise(resolve => {
172
+
173
+ setTimeout(() => { resolve(_.difference(...e)); }, 0);
174
+
175
+ })
176
+
177
+ );
178
+
179
+ return Promise.all(promises);
180
+
181
+ };
182
+
183
+
184
+
185
+ const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
186
+
187
+
188
+
189
+ const b = a.map(e => 2 * e);
190
+
191
+
192
+
193
+ diff(a, b).then(values => { console.log(values); }); // => [ [ 12, 14, 16, 18, 20 ], [ 1, 3, 5, 7, 9 ] ]
194
+
195
+ ```

16

テキスト修正

2018/06/02 14:13

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -109,3 +109,33 @@
109
109
 
110
110
 
111
111
  [https://jsfiddle.net/jun68ykt/pLuzg0u4/2/](https://jsfiddle.net/jun68ykt/pLuzg0u4/2/)
112
+
113
+
114
+
115
+ ---
116
+
117
+ **補足2**
118
+
119
+
120
+
121
+ 質問者様のイメージされる、
122
+
123
+
124
+
125
+ > 同時に
126
+
127
+
128
+
129
+ の趣旨からすると、私の回答では「同時に抽出することになっていない」というご評価でしたら、
130
+
131
+ ご質問に
132
+
133
+
134
+
135
+ > 理想は同時に抽出する方法ですが、それは難しいのではないかと思っているいたりするので、よりスマートに別々に抽出する方法がありましたら、そちらだけでもご回答いただけると幸いです。
136
+
137
+
138
+
139
+ とあるので、上記の方法、すなわち、別々に抽出する方法のリファクタ案のひとつとして
140
+
141
+ お考え頂ければと思います。

15

テキスト修正

2018/05/27 23:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- という配列として返す関数になっており、これがご質問にある、
39
+ という配列の配列として返す関数になっており、これがご質問にある、
40
40
 
41
41
 
42
42
 
@@ -44,11 +44,11 @@
44
44
 
45
45
 
46
46
 
47
- という働きをしてくれるものになっています。
47
+ という働きをしてくれるものになっているかと思います。
48
48
 
49
- (※ "同時に" という意味を、「一回の関数呼び出しで、追加分と削除分の両方が得られる」という
49
+ (※ 「一回の関数呼び出しで、追加分と削除分の両方が得られる」ということをもって、
50
50
 
51
- 意味考えれば、ですが。)
51
+ 質問者様にっての、"同時に" といってよいとすれば、ですが。)
52
52
 
53
53
 
54
54
 

14

テキスト修正

2018/05/27 21:29

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -30,7 +30,11 @@
30
30
 
31
31
  上記の関数 `diff(ar1, ar2)` は、配列 ar1, ar2の差分を、
32
32
 
33
+
34
+
33
35
  **[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] **
36
+
37
+
34
38
 
35
39
  という配列として返す関数になっており、これがご質問にある、
36
40
 
@@ -40,7 +44,15 @@
40
44
 
41
45
 
42
46
 
43
- という働きをしてくれるものになっています。たとえば、
47
+ という働きをしてくれるものになっています。
48
+
49
+ (※ "同時に" という意味を、「一回の関数呼び出しで、追加分と削除分の両方が得られる」という
50
+
51
+ 意味と考えれば、ですが。)
52
+
53
+
54
+
55
+ たとえば、
44
56
 
45
57
 
46
58
 

13

テキスト修正

2018/05/27 21:26

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -28,15 +28,11 @@
28
28
 
29
29
 
30
30
 
31
- 上記の関数 `diff(ar1, ar2)` は、
31
+ 上記の関数 `diff(ar1, ar2)` は、配列 ar1, ar2の差分を、
32
32
 
33
+ **[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] **
33
34
 
34
-
35
- 配列 ar1, ar2の差分を、**[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] ** という配列として返す
36
-
37
-
38
-
39
- 関数になっており、これがご質問にある、
35
+ という配列として返す関数になっており、これがご質問にある、
40
36
 
41
37
 
42
38
 

12

テキスト修正

2018/05/27 21:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
File without changes

11

テキスト修正

2018/05/27 21:18

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -32,11 +32,11 @@
32
32
 
33
33
 
34
34
 
35
- 配列 ar1 ar2の差分を、**[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] ** という配列として返す関数
35
+ 配列 ar1, ar2の差分を、**[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] ** という配列として返す
36
36
 
37
37
 
38
38
 
39
- になっており、これがご質問にある、
39
+ 関数になっており、これがご質問にある、
40
40
 
41
41
 
42
42
 

10

テキスト修正

2018/05/27 21:18

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- **配列 ar1、 ar2の差分を、[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] という配列として返す関数**
35
+ 配列 ar1、 ar2の差分を、**[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] ** という配列として返す関数
36
36
 
37
37
 
38
38
 

9

テキスト修正

2018/05/27 21:17

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,61 +2,25 @@
2
2
 
3
3
 
4
4
 
5
- 2つの配列a, b を集合と考えたときに、[lodash](https://lodash.com/) の [difference](https://lodash.com/docs/4.17.10#difference) を使うと、
6
-
7
- 差集合 a - b に相当する配列を取得できますので、これを利用します。
5
+ [lodash](https://lodash.com/) の [difference](https://lodash.com/docs/4.17.10#difference) を使うと、2つの配列 ar1, ar2 を集合と考えたときに、[差集合](https://ja.wikipedia.org/wiki/%E5%B7%AE%E9%9B%86%E5%90%88) ar1 - ar2 に相当する配列を
8
6
 
9
7
 
10
8
 
11
- まずご自身の環境にあわせて、 `lodash`を以下のようにして使えるようにします。
12
-
13
-
14
-
15
- ・lodash をNode.js で使う場合:
16
-
17
-
18
-
19
- npm または yarn で lodash をインストールして
20
-
21
9
  ```javascript
22
10
 
23
- const _ = require('lodash');
11
+ _.difference(ar1, ar2)
24
12
 
25
13
  ```
26
14
 
27
15
 
28
16
 
29
- ・lodash をブラウザ使う場合:
17
+ 取得できます。
30
18
 
31
- ```html
32
-
33
- <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
34
-
35
- ```
36
-
37
-
38
-
39
- 上記のいずかによって、 `_` を使えるようにておくと、2つの配列a, b を集合と考えたときの
19
+ を使って、次のような関数 `diff` を定義ます。
40
-
41
- 差集合 a - b は、
42
20
 
43
21
 
44
22
 
45
23
  ```javascript
46
-
47
- _.difference(a, b)
48
-
49
- ```
50
-
51
-
52
-
53
- で取得できます。これを使って、次のような関数 `diff` を定義します。
54
-
55
-
56
-
57
- ```javascript
58
-
59
- // 配列 ar1、 ar2の差分を配列として返す関数
60
24
 
61
25
  const diff = (ar1, ar2) => [[ar2,ar1], [ar1,ar2]].map(e => _.difference(...e));
62
26
 
@@ -64,15 +28,23 @@
64
28
 
65
29
 
66
30
 
67
- 上記の関数 `diff` ご質問にある、
31
+ 上記の関数 `diff(ar1, ar2)`
32
+
33
+
34
+
35
+ **配列 ar1、 ar2の差分を、[ 差集合(ar2-ar1)の配列, 差集合(ar1-ar2)の配列 ] という配列として返す関数**
36
+
37
+
38
+
39
+ になっており、これがご質問にある、
40
+
41
+
68
42
 
69
43
  > 同時に抽出する
70
44
 
71
45
 
72
46
 
73
- という働きをしてくれるものになっています。
47
+ という働きをしてくれるものになっています。たとえば、
74
-
75
- たとえば、
76
48
 
77
49
 
78
50
 
@@ -100,7 +72,7 @@
100
72
 
101
73
 
102
74
 
103
- 上記の配列は2つの配列を要素とする配列で
75
+ 上記は2つの配列を要素とする配列で
104
76
 
105
77
 
106
78
 
@@ -128,4 +100,4 @@
128
100
 
129
101
 
130
102
 
131
- [https://jsfiddle.net/jun68ykt/pLuzg0u4/1/](https://jsfiddle.net/jun68ykt/pLuzg0u4/1/)
103
+ [https://jsfiddle.net/jun68ykt/pLuzg0u4/2/](https://jsfiddle.net/jun68ykt/pLuzg0u4/2/)

8

テキスト修正

2018/05/27 21:03

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,8 +1,4 @@
1
1
  こんにちは。
2
-
3
-
4
-
5
- 以下のような方法はいかがでしょうか。
6
2
 
7
3
 
8
4
 
@@ -40,7 +36,9 @@
40
36
 
41
37
 
42
38
 
43
- 上記のいずれかによって、 `_` を使えるようにしておいて差集合 a - b を求める
39
+ 上記のいずれかによって、 `_` を使えるようにしておくと2つの配列a, b を集合と考えたときの
40
+
41
+ 差集合 a - b は、
44
42
 
45
43
 
46
44
 
@@ -52,7 +50,7 @@
52
50
 
53
51
 
54
52
 
55
- を使って、次のような関数 `diff` を定義します。
53
+ で取得できます。これを使って、次のような関数 `diff` を定義します。
56
54
 
57
55
 
58
56
 
@@ -116,14 +114,18 @@
116
114
 
117
115
  となります。
118
116
 
117
+ 以上参考になれば幸いです。
119
118
 
120
119
 
120
+
121
+ ---
122
+
123
+ **補足**
124
+
125
+
126
+
121
- このやり方で実装したサンプルコードを、以下のURLに上げておきました。
127
+ この回答のやり方で実装したサンプルコードを、以下のURLに上げておきました。
122
128
 
123
129
 
124
130
 
125
131
  [https://jsfiddle.net/jun68ykt/pLuzg0u4/1/](https://jsfiddle.net/jun68ykt/pLuzg0u4/1/)
126
-
127
-
128
-
129
- 以上参考になれば幸いです。

7

テキスト修正

2018/05/27 15:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -17,6 +17,10 @@
17
17
 
18
18
 
19
19
  ・lodash をNode.js で使う場合:
20
+
21
+
22
+
23
+ npm または yarn で lodash をインストールして
20
24
 
21
25
  ```javascript
22
26
 

6

テキスト修正

2018/05/27 15:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
 
70
70
 
71
- という働きをしてくれるものになっていると思いますが、いかがでしょう?
71
+ という働きをしてくれるものになっています
72
72
 
73
73
  たとえば、
74
74
 
@@ -118,7 +118,7 @@
118
118
 
119
119
 
120
120
 
121
- [https://jsfiddle.net/jun68ykt/pLuzg0u4/](https://jsfiddle.net/jun68ykt/pLuzg0u4/)
121
+ [https://jsfiddle.net/jun68ykt/pLuzg0u4/1/](https://jsfiddle.net/jun68ykt/pLuzg0u4/1/)
122
122
 
123
123
 
124
124
 

5

ソース修正

2018/05/27 15:20

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -54,7 +54,9 @@
54
54
 
55
55
  ```javascript
56
56
 
57
+ // 配列 ar1、 ar2の差分を配列として返す関数
58
+
57
- const diff = (a, b) => [[b,a], [a,b]].map(e => _.difference(...e));
59
+ const diff = (ar1, ar2) => [[ar2,ar1], [ar1,ar2]].map(e => _.difference(...e));
58
60
 
59
61
  ```
60
62
 

4

テキスト修正

2018/05/27 15:18

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -12,7 +12,11 @@
12
12
 
13
13
 
14
14
 
15
+ まずご自身の環境にあわせて、 `lodash`を以下のようにして使えるようにします。
16
+
17
+
18
+
15
- lodash をNode.js で使う場合:
19
+ lodash をNode.js で使う場合:
16
20
 
17
21
  ```javascript
18
22
 
@@ -22,7 +26,7 @@
22
26
 
23
27
 
24
28
 
25
- lodash をブラウザで使う場合:
29
+ lodash をブラウザで使う場合:
26
30
 
27
31
  ```html
28
32
 
@@ -32,7 +36,7 @@
32
36
 
33
37
 
34
38
 
35
- 上記のいずれかによって、 `_` を使えるようにしておいて、
39
+ 上記のいずれかによって、 `_` を使えるようにしておいて、差集合 a - b を求める
36
40
 
37
41
 
38
42
 
@@ -44,7 +48,7 @@
44
48
 
45
49
 
46
50
 
47
- 上記の `difference` を使って、以下のような関数 `diff` を定義します。
51
+ を使って、のような関数 `diff` を定義します。
48
52
 
49
53
 
50
54
 

3

テキスト修正

2018/05/27 15:15

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -8,15 +8,35 @@
8
8
 
9
9
  2つの配列a, b を集合と考えたときに、[lodash](https://lodash.com/) の [difference](https://lodash.com/docs/4.17.10#difference) を使うと、
10
10
 
11
- 差集合 a - b に相当する配列を以下で取得できます。
11
+ 差集合 a - b に相当する配列を取得できますので、これを利用します
12
12
 
13
13
 
14
+
15
+ lodash をNode.js で使う場合:
14
16
 
15
17
  ```javascript
16
18
 
17
19
  const _ = require('lodash');
18
20
 
21
+ ```
19
22
 
23
+
24
+
25
+ lodash をブラウザで使う場合:
26
+
27
+ ```html
28
+
29
+ <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
30
+
31
+ ```
32
+
33
+
34
+
35
+ 上記のいずれかによって、 `_` を使えるようにしておいて、
36
+
37
+
38
+
39
+ ```javascript
20
40
 
21
41
  _.difference(a, b)
22
42
 
@@ -24,15 +44,11 @@
24
44
 
25
45
 
26
46
 
27
- これを使って、以下のような関数 `diff` を定義します。
47
+ 上記の `difference` を使って、以下のような関数 `diff` を定義します。
28
48
 
29
49
 
30
50
 
31
51
  ```javascript
32
-
33
- const _ = require('lodash');
34
-
35
-
36
52
 
37
53
  const diff = (a, b) => [[b,a], [a,b]].map(e => _.difference(...e));
38
54
 
@@ -92,4 +108,12 @@
92
108
 
93
109
 
94
110
 
111
+ このやり方で実装したサンプルコードを、以下のURLに上げておきました。
112
+
113
+
114
+
115
+ [https://jsfiddle.net/jun68ykt/pLuzg0u4/](https://jsfiddle.net/jun68ykt/pLuzg0u4/)
116
+
117
+
118
+
95
119
  以上参考になれば幸いです。

2

テキスト修正

2018/05/27 15:09

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,17 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- ご質問にある、
6
-
7
-
8
-
9
- > 理想は同時に抽出する方法ですが、それは難しいのではないかと思っているいたりするので、
10
-
11
- りスマートに別々に抽出する方法がありまたら、
5
+ 以下のうな方法はいかょうか。
12
-
13
-
14
-
15
- の一例です。
16
6
 
17
7
 
18
8
 
@@ -50,7 +40,15 @@
50
40
 
51
41
 
52
42
 
53
- 上記の `diff` を使うとたとえば
43
+ 上記の関数 `diff` ご質問にある、
44
+
45
+ > 同時に抽出する
46
+
47
+
48
+
49
+ という働きをしてくれるものになっていると思いますが、いかがでしょう?
50
+
51
+ たとえば、
54
52
 
55
53
 
56
54
 

1

テキスト修正

2018/05/27 14:43

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- 上記の `diff` を使うと、
53
+ 上記の `diff` を使うと、たとえば
54
54
 
55
55
 
56
56