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

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

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

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

Q&A

解決済

3回答

4985閲覧

連想配列内の重複チェックの仕方が分からない

asakura

総合スコア29

JavaScript

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

0グッド

2クリップ

投稿2017/12/16 10:40

連想配列に登録する時に重複チェックをしたいのですが、うまく行きません。

重複チェックが、意図通りに動かず、
以下のように、idの値が重複し登録されてしまいます。
{ id: '1000', language: 'ja' },
{ id: '1001', language: 'en' },
{ id: '1000', language: 'ja' }

挙動としては、
id:1000⇒id:1001までは意図通り登録されるのですが、
登録する直前の値のみ参照して重複チェックをしているため、id:1000⇒id:1001⇒id:1000とした場合、
id:1000が重複エラーにならずに登録されてしまう、
といった事になります。

id参照時に全ての値をチェックすれば良いのでしょうか、
どのようにするのか、分からず、
どのように処理を行えば良いか、教えて頂けないでしょうか。

以下、いま記述しているコードを添付します。

js

1var connectUser=[]; 2 3// 配列の行を取得 4arryCnt = (Object.keys(connectUser).length); 5 6// 配列内に何もなかったら連想配列に登録 7if (arryCnt === 0) { 8 connectUser.push({ id: id, language: language }) 9} else { 10 for (key in connectUser) { 11 arryId = (connectUser[arryCnt - 1].id); 12// IDが同じだった場合、配列に登録しない 13 if (arryId !== id) { 14 connectUser.push({ id: id, language: language }); 15 } else { 16 console.log('重複エラー'); 17 } 18 } 19}

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

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

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

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

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

karamarimo

2017/12/16 11:28

連想配列内ではなく配列内の重複ではないでしょうか?
guest

回答3

0

配列をテストするなら Array.prototype.some() を使えます。その中で id を調べればよいかと。

JavaScript

1var connectUser = []; 2function add( id, language ) { 3 if ( connectUser.some( el=> el.id === id ) ) { 4 console.log( '重複エラー' ); 5 } else { 6 connectUser.push( { id: id, language: language } ); 7 console.log( 'add' ); 8 } 9} 10add( 100, 'jp' ); // add 11add( 101, 'en' ); // add 12add( 100, 'en' ); // 重複エラー 13```**動くサンプル:**[https://jsfiddle.net/ery8pbmm/](https://jsfiddle.net/ery8pbmm/) 14 15--- 16 17 18 19【Array.prototype.some() - JavaScript | MDN20[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some)

投稿2017/12/16 18:18

kei344

総合スコア69364

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

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

0

ベストアンサー

連想配列の、ではなく、連想配列の配列の重複チェックですね。

提示のコードでは、for文内でconnectUser[arryCnt - 1]を使っていますが、それだと毎回最後に追加された要素しか見れません。
また、for文を回し、idが一致しない要素が1つでもあれば、配列にpushするようになっています。
私はこういうときは一度すべての要素を検査し、一つでも重複があればフラグを立てるやり方をすることが多いです。(後で見たときにこれが一番理解しやすいので。)

var isUserExists = false; for(var index in connectUser){ if(connectUser[index].id == id){ isUserExists = true; break; // 一つでも見つかれば以降は確認する必要なし } } if(isUserExists){ // 重複!! }else{ connectUser.push({ "id": id, "language": language }); }

投稿2017/12/16 17:36

moredeep

総合スコア1507

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

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

asakura

2017/12/17 01:12

ありがとうございました。 シンプルで非常に分かりやすく、 大変参考になります。
guest

0

キーの既存はin演算子を使えばいいし、代入は普通に=を使えばいいのでは。

ちょっとしたテスト。

abcd=[]; abcd["id:1000"]="ja"; abcd["id:1001"]="en"; abcd["id:1000"]="en"; if("id:1000" in abcd){ console.log("重複"); }else{ abcd["id:1000"]="de"; } if("id:1010" in abcd){ console.log("重複"); }else{ abcd["id:100"]="de"; }

これでabcdの中身がどうなるか見てみると理解できるのではないでしょうか。
なお、abcd["1000"]だとキーが数字扱いされてしまい連想配列にならないぽいので気を付けましょう。

投稿2017/12/16 11:18

KojiDoi

総合スコア13669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問