回答編集履歴

10

テキスト修正

2018/10/25 12:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- - [https://jsfiddle.net/jun68ykt/dtqufhyg/5/](https://jsfiddle.net/jun68ykt/dtqufhyg/5/)
35
+ - [https://jsfiddle.net/jun68ykt/dtqufhyg/6/](https://jsfiddle.net/jun68ykt/dtqufhyg/6/)
36
36
 
37
37
 
38
38
 

9

テキスト修正

2018/10/25 12:40

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- ご質問に挙げられているコードに対して、少ない修正で済ます方法としては、`var set`を作るところで、以下のように `...` によるスプレッドを使う手もあるかと思います。
5
+ ご質問に挙げられているコードに対して、少ない修正で済ます方法としては、`var set`を作るところで、以下のように `...` によるスプレッドを使えば、配列になります。
6
6
 
7
7
 
8
8
 
@@ -22,7 +22,7 @@
22
22
 
23
23
  ```javascript
24
24
 
25
- var set = [...(new Set(arr))];
25
+ var set = [...new Set(arr)];
26
26
 
27
27
  ```
28
28
 
@@ -32,7 +32,7 @@
32
32
 
33
33
 
34
34
 
35
- - [https://jsfiddle.net/jun68ykt/dtqufhyg/4/](https://jsfiddle.net/jun68ykt/dtqufhyg/4/)
35
+ - [https://jsfiddle.net/jun68ykt/dtqufhyg/5/](https://jsfiddle.net/jun68ykt/dtqufhyg/5/)
36
36
 
37
37
 
38
38
 

8

テキスト修正

2018/10/25 12:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -129,3 +129,49 @@
129
129
 
130
130
 
131
131
  > 真の値を返す要素が見つかると、some() は**ただちに** true を返します。
132
+
133
+
134
+
135
+ #### 追記3
136
+
137
+
138
+
139
+ 追記2で、ソートしてから重複する要素を探しましたが、そもそも重複する要素があれば、 ソートする過程で行う一対比較においてみつかるはずですので、これを使うと(ちょっと違和感のあるコードかもしれませんが、)以下になるかなと思います。
140
+
141
+
142
+
143
+ ```javascript
144
+
145
+ const hasDuplicates = (arr) => {
146
+
147
+ try {
148
+
149
+ arr.sort((a, b) => {
150
+
151
+ if ( a === b )
152
+
153
+ throw new Error('Duplicate elements detected');
154
+
155
+ return a - b;
156
+
157
+ });
158
+
159
+ } catch (e) {
160
+
161
+ return true;
162
+
163
+ }
164
+
165
+ return false;
166
+
167
+ };
168
+
169
+ ```
170
+
171
+
172
+
173
+ - **上記のサンプル:** [https://jsfiddle.net/jun68ykt/5mkxpuf9/3/](https://jsfiddle.net/jun68ykt/5mkxpuf9/3/)
174
+
175
+
176
+
177
+ 上記で、”そもそも重複する要素があれば、 ソートする過程で行う一対比較においてみつかる**はず** ”と言い切ってますが、「本当だろうか?」と自分でも半信半疑なところがあります。ここをちゃんと確信持つには証明が必要です。

7

テキスト追加

2018/10/25 11:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- とはいえ、x_x さんのご回答にように、 Set には要素数を返す size があるので、これを使わない手はないと思います。
45
+ とはいえ、x_x さんのご回答にように、 Set には要素数を返す size があるので、これを使わない手はないと思います。
46
46
 
47
47
 
48
48
 

6

テキスト追加

2018/10/25 08:31

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -118,7 +118,7 @@
118
118
 
119
119
  ```
120
120
 
121
- - **上記のサンプル:** [https://jsfiddle.net/jun68ykt/hmv27rdb/17/](https://jsfiddle.net/jun68ykt/hmv27rdb/17/)
121
+ - **上記のサンプル:** [https://jsfiddle.net/jun68ykt/hmv27rdb/18/](https://jsfiddle.net/jun68ykt/hmv27rdb/18/)
122
122
 
123
123
 
124
124
 

5

テキスト追加

2018/10/25 08:30

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -122,7 +122,7 @@
122
122
 
123
123
 
124
124
 
125
- これは、 [Array.prototype.some()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some) に記載以下を使っています。
125
+ これは、 [Array.prototype.some() の説明](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some#%E8%AA%AC%E6%98%8E) に記載されている、以下を使っています。
126
126
 
127
127
 
128
128
 

4

テキスト追加

2018/10/25 08:21

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -102,7 +102,7 @@
102
102
 
103
103
  const sortedArr = arr.sort();
104
104
 
105
- return sortedArr.some((e, i) => i < arr.length - 1 && e === sortedArr[i+1]);
105
+ return sortedArr.some((e, i, a) => i < a.length - 1 && e === a[i+1]);
106
106
 
107
107
  };
108
108
 
@@ -118,7 +118,7 @@
118
118
 
119
119
  ```
120
120
 
121
- - **上記のサンプル:** [https://jsfiddle.net/jun68ykt/hmv27rdb/12/](https://jsfiddle.net/jun68ykt/hmv27rdb/12/)
121
+ - **上記のサンプル:** [https://jsfiddle.net/jun68ykt/hmv27rdb/17/](https://jsfiddle.net/jun68ykt/hmv27rdb/17/)
122
122
 
123
123
 
124
124
 

3

テキスト追加

2018/10/25 08:18

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- #### 追記
49
+ #### 追記1
50
50
 
51
51
 
52
52
 
@@ -71,3 +71,61 @@
71
71
  }
72
72
 
73
73
  ```
74
+
75
+
76
+
77
+ #### 追記2
78
+
79
+
80
+
81
+ Set を使わない方法も考えてみました。
82
+
83
+
84
+
85
+ 要素は数字であって、重複があるかないかだけを判定できればよいので、ソートして小さいほうから調べていき、同じ値が隣り合っている要素を見つけたら、その時点で走査をやめて、「重複あり」を返すようにすればよいかと思います。
86
+
87
+
88
+
89
+ たとえば入力が `[1, 2, 3, 4, 5, 6, 3, 7, 8, 5]` だったら、これをソートして得られる、
90
+
91
+ `[1, 2, 3, 3, 4, 5, 5, 6, 7, 8]` を小さいほうから調べていき、 `3` が隣り合っているのを見つけた時点で、以後の要素については調べるのをやめて、即座に「重複あり」を返させたいです。
92
+
93
+
94
+
95
+ 以下は上記の考えのコード例です。
96
+
97
+
98
+
99
+ ```javascript
100
+
101
+ const hasDuplicates = (arr) => {
102
+
103
+ const sortedArr = arr.sort();
104
+
105
+ return sortedArr.some((e, i) => i < arr.length - 1 && e === sortedArr[i+1]);
106
+
107
+ };
108
+
109
+
110
+
111
+ console.log(hasDuplicates([1, 2, 3, 4, 5, 6, 3, 7, 8, 5]) ? '重複あり' : '重複なし'); // => 重複あり
112
+
113
+
114
+
115
+ console.log(hasDuplicates([1, 3, 5, 9, 10, 8, 6, 4, 2, 0]) ? '重複あり' : '重複なし'); // => 重複なし
116
+
117
+
118
+
119
+ ```
120
+
121
+ - **上記のサンプル:** [https://jsfiddle.net/jun68ykt/hmv27rdb/12/](https://jsfiddle.net/jun68ykt/hmv27rdb/12/)
122
+
123
+
124
+
125
+ これは、 [Array.prototype.some()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some) に記載の以下を使っています。
126
+
127
+
128
+
129
+
130
+
131
+ > 真の値を返す要素が見つかると、some() は**ただちに** true を返します。

2

テキスト追加

2018/10/25 08:15

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -42,12 +42,32 @@
42
42
 
43
43
 
44
44
 
45
- 参考になれば幸す。
45
+ とはいえ、x_x さんのご回答ように、 Set には要素数を返す size があるので、これを使わない手はないかと思います。
46
46
 
47
47
 
48
48
 
49
- #### 補足
49
+ #### 追記
50
50
 
51
51
 
52
52
 
53
+ 以下に同様の質問がありました。
54
+
55
+
56
+
57
+ - stackoverflow: [in-javascript-how-do-i-check-if-an-array-has-duplicate-values](https://stackoverflow.com/questions/7376598/in-javascript-how-do-i-check-if-an-array-has-duplicate-values)
58
+
59
+
60
+
61
+ ここでも、一番得票数の多い[回答](https://stackoverflow.com/a/7376645)の一番上に以下のコードが挙げられています。
62
+
63
+
64
+
65
+ ```javascript
66
+
67
+ function hasDuplicates(array) {
68
+
53
- とはいえ、x_x さんのご回答にように、 Set には要素数を返す size があるので、これを使わない手はないかと思います。
69
+ return (new Set(array)).size !== array.length;
70
+
71
+ }
72
+
73
+ ```

1

テキスト追加

2018/10/25 07:27

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -40,4 +40,14 @@
40
40
 
41
41
 
42
42
 
43
+
44
+
43
45
  参考になれば幸いです。
46
+
47
+
48
+
49
+ #### 補足
50
+
51
+
52
+
53
+ とはいえ、x_x さんのご回答にように、 Set には要素数を返す size があるので、これを使わない手はないかと思います。