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

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

ただいまの
回答率

88.58%

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

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 1,904

mi_mi

score 19

var arr = [1,2,3,4,5,6,2,1];
console.log(arr);

var set = [(new Set(arr))];
console.log(set);

if ( arr.length == set.length )//setlengthがうまく取得できないので判定がうまくいかない。
{
console.log("重複ありません");
}
else
{
console.log("重複あります");
}

・やった事
上記のコードで実行してみた。が、set.lengtの部分が配列ではないから?エラーがおこる。
・やりたい事
setで取得した数と、元の配列内の数を比較したい

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+4

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 21:52

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

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

こんにちは。

ご質問に挙げられているコードに対して、少ない修正で済ます方法としては、var setを作るところで、以下のように ... によるスプレッドを使えば、配列になります。

修正前:

var set = [(new Set(arr))];


 
修正後:

var set = [...new Set(arr)];

以下は上記の確認用のサンプルです。

(※ただし上記の場合、 set という変数名はよくないかもしれません。)

とはいえ、x_x さんのご回答にように、 Set には要素数を返す size があるので、これを使わない手はないと思います。

 追記1

以下に同様の質問がありました。

ここでも、一番得票数の多い回答の一番上に以下のコードが挙げられています。

function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}

 追記2

Set を使わない方法も考えてみました。

要素は数字であって、重複があるかないかだけを判定できればよいので、ソートして小さいほうから調べていき、同じ値が隣り合っている要素を見つけたら、その時点で走査をやめて、「重複あり」を返すようにすればよいかと思います。

たとえば入力が [1, 2, 3, 4, 5, 6, 3, 7, 8, 5] だったら、これをソートして得られる、
[1, 2, 3, 3, 4, 5, 5, 6, 7, 8] を小さいほうから調べていき、 3 が隣り合っているのを見つけた時点で、以後の要素については調べるのをやめて、即座に「重複あり」を返させたいです。

以下は上記の考えのコード例です。

const hasDuplicates = (arr) => {
  const sortedArr = arr.sort();
  return sortedArr.some((e, i, a) => i < a.length - 1 && e === a[i+1]);
};

console.log(hasDuplicates([1, 2, 3, 4, 5, 6, 3, 7, 8, 5]) ? '重複あり' : '重複なし'); // => 重複あり

console.log(hasDuplicates([1, 3, 5, 9, 10, 8, 6, 4, 2, 0]) ? '重複あり' : '重複なし'); // => 重複なし

これは、 Array.prototype.some() の説明 に記載されている、以下を使っています。

真の値を返す要素が見つかると、some() はただちに true を返します。

 追記3 

追記2で、ソートしてから重複する要素を探しましたが、そもそも重複する要素があれば、 ソートする過程で行う一対比較においてみつかるはずですので、これを使うと(ちょっと違和感のあるコードかもしれませんが、)以下になるかなと思います。

const hasDuplicates = (arr) => {
  try {
    arr.sort((a, b) => {
      if ( a === b )
        throw new Error('Duplicate elements detected');
      return a - b;
    });
  } catch (e) {
    return true;
  }
  return false;
};

上記で、”そもそも重複する要素があれば、 ソートする過程で行う一対比較においてみつかるはず ”と言い切ってますが、「本当だろうか?」と自分でも半信半疑なところがあります。ここをちゃんと確信持つには証明が必要です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 21:56

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

    キャンセル

+1

別の質問で「配列の中である条件を満たすものがあるかないかを知りたい、っていうのがあって、some一択だねって回答したら、その値を利用したくって、filterが必要だったことがあったんですが、それでもsomeを使いたいです

const arr = [1,2,3,4,5,6,2,1];
console.log(arr.some(function(element, index, array) {return array.indexOf(element) !== index;})); //true

const distinct = [1,2,3,4,5,6];
console.log(distinct.some(function(element, index, array) {return array.indexOf(element) !== index;})); //false

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 21:53

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

    キャンセル

+1

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

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

MDN:Aray.from()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 15:45

    sizeがありました。

    キャンセル

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る