質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

1232閲覧

配列内で重複している数字があるかチェックしたい。

mi_mi

総合スコア19

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/10/25 06:10

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

JavaScript

1var set = new Set(arr); 2console.log(set.size); // 6

投稿2018/10/25 06:30

編集2018/10/25 06:30
x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mi_mi

2018/10/25 12:52

sizeで取得できるのですね!ありがとうございました
guest

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
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mi_mi

2018/10/25 12:56

junさん今日もサンプル沢山ありがとうございます。 setを使わない追記の方法も考えたかったので追記2とても参考になりました!
guest

0

javascript

1var a = [1,2,3,4,5,6,2,1]; 2var b = a.filter(function (x, i, self) { 3 return self.indexOf(x) !== self.lastIndexOf(x); 4}); 5console.log(b.length>0);

投稿2018/10/25 06:15

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

趣旨が違うので別回答を立てます。

質問者様は、Setにlengthがないことにお困り(valuesやentriesもIteratorを返す)なのですが、Setにして重複を削る着想を得たなら、Array.from(Set)で配列に戻してlengthを見るという方法もあるかと思います。

MDN:Aray.from()

投稿2018/10/25 06:44

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/10/25 06:45

sizeがありました。
guest

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

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mi_mi

2018/10/25 12:53

someとfilterもたしかに迷ったんです! 教えていただきありがとうございます! 色んな例題を教えていただけるので助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問