javascrirp
1var arr = [1,2,3,4,5,6,2,1]; 2console.log(arr); 3 4var set = [(new Set(arr))]; 5console.log(set); 6 7if ( arr.length == set.length )//setのlengthがうまく取得できないので判定がうまくいかない。 8{ 9console.log("重複ありません"); 10} 11else 12{ 13console.log("重複あります"); 14}
・やった事
上記のコードで実行してみた。が、set.lengtの部分が配列ではないから?エラーがおこる。
・やりたい事
setで取得した数と、元の配列内の数を比較したい
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
JavaScript
1var set = new Set(arr); 2console.log(set.size); // 6
投稿2018/10/25 06:30
編集2018/10/25 06:30総合スコア13749
0
こんにちは。
ご質問に挙げられているコードに対して、少ない修正で済ます方法としては、var set
を作るところで、以下のように ...
によるスプレッドを使えば、配列になります。
修正前:
javascript
1var set = [(new Set(arr))];
修正後:
javascript
1var set = [...new Set(arr)];
以下は上記の確認用のサンプルです。
(※ただし上記の場合、 set
という変数名はよくないかもしれません。)
とはいえ、x_x さんのご回答にように、 Set には要素数を返す size があるので、これを使わない手はないと思います。
追記1
以下に同様の質問がありました。
ここでも、一番得票数の多い回答の一番上に以下のコードが挙げられています。
javascript
1function hasDuplicates(array) { 2 return (new Set(array)).size !== array.length; 3}
追記2
Set を使わない方法も考えてみました。
要素は数字であって、重複があるかないかだけを判定できればよいので、ソートして小さいほうから調べていき、同じ値が隣り合っている要素を見つけたら、その時点で走査をやめて、「重複あり」を返すようにすればよいかと思います。
たとえば入力が [1, 2, 3, 4, 5, 6, 3, 7, 8, 5]
だったら、これをソートして得られる、
[1, 2, 3, 3, 4, 5, 5, 6, 7, 8]
を小さいほうから調べていき、 3
が隣り合っているのを見つけた時点で、以後の要素については調べるのをやめて、即座に「重複あり」を返させたいです。
以下は上記の考えのコード例です。
javascript
1const hasDuplicates = (arr) => { 2 const sortedArr = arr.sort(); 3 return sortedArr.some((e, i, a) => i < a.length - 1 && e === a[i+1]); 4}; 5 6console.log(hasDuplicates([1, 2, 3, 4, 5, 6, 3, 7, 8, 5]) ? '重複あり' : '重複なし'); // => 重複あり 7 8console.log(hasDuplicates([1, 3, 5, 9, 10, 8, 6, 4, 2, 0]) ? '重複あり' : '重複なし'); // => 重複なし 9
これは、 Array.prototype.some() の説明 に記載されている、以下を使っています。
真の値を返す要素が見つかると、some() はただちに true を返します。
追記3
追記2で、ソートしてから重複する要素を探しましたが、そもそも重複する要素があれば、 ソートする過程で行う一対比較においてみつかるはずですので、これを使うと(ちょっと違和感のあるコードかもしれませんが、)以下になるかなと思います。
javascript
1const hasDuplicates = (arr) => { 2 try { 3 arr.sort((a, b) => { 4 if ( a === b ) 5 throw new Error('Duplicate elements detected'); 6 return a - b; 7 }); 8 } catch (e) { 9 return true; 10 } 11 return false; 12};
上記で、”そもそも重複する要素があれば、 ソートする過程で行う一対比較においてみつかるはず ”と言い切ってますが、「本当だろうか?」と自分でも半信半疑なところがあります。ここをちゃんと確信持つには証明が必要です。
投稿2018/10/25 07:14
編集2018/10/25 12:40総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
趣旨が違うので別回答を立てます。
質問者様は、Setにlengthがないことにお困り(valuesやentriesもIteratorを返す)なのですが、Setにして重複を削る着想を得たなら、Array.from(Set)
で配列に戻してlengthを見るという方法もあるかと思います。
投稿2018/10/25 06:44
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
別の質問で「配列の中である条件を満たすものがあるかないかを知りたい、っていうのがあって、some一択だねって回答したら、その値を利用したくって、filterが必要だったことがあったんですが、それでもsomeを使いたいです
javascript
1const arr = [1,2,3,4,5,6,2,1]; 2console.log(arr.some(function(element, index, array) {return array.indexOf(element) !== index;})); //true 3 4const distinct = [1,2,3,4,5,6]; 5console.log(distinct.some(function(element, index, array) {return array.indexOf(element) !== index;})); //false
投稿2018/10/25 06:30
総合スコア12705
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/25 12:52