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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

5回答

405閲覧

JavaScriptで複数ある値の中から特定の値が含まれているか判別したい

aDGDy02001

総合スコア24

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

1グッド

0クリップ

投稿2024/09/17 09:44

実現したいこと

JavaScriptで複数ある値(該当ソースのsampleCode)の中から「02、03、04、05、32、33、34、35」のいずれかが含まれている場合は「テストAです」を返し、さらに「02、03、04、05」のいずれかが含まれている場合は「テストBです」も返し、「32、33、34、35」のいずれかが含まれている場合は「テストCです」を返したいです。

つまりsampleCodeが["03","04","32"]の場合は「テストAです」と「テストBです」と「テストCです」それぞれ1度だけ返されるようにしたいです。

発生している問題・分からないこと

判定はできたのですが、その結果が複数返ってしまいます。
該当のソースで言うと、「テストAです」が3回、「テストBです」が2回、「テストCです」が1回返ってきている状態です…。

該当のソースコード

JavaScript

1<script type="module"> 2 const sampleCode = ["03","04","32"]; 3 sampleCode.filter(function(value) { 4 if (value == '02' || value == '03' || value == '04' || value == '05' || value == '32' || value == '33' || value == '34' || value == '35') { 5 console.log('テストAです') 6 } 7 if (value == '02' || value == '03' || value == '04' || value == '05') { 8 console.log('テストBです') 9 } 10 if (value == '32' || value == '33' || value == '34' || value == '35') { 11 console.log('テストCです') 12 } 13 }) 14</script>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

filter以外にindexOf、includes、search、test、matchなどのメソッドでテストしてみたりしましたがうまくいきませんでした。

補足

特になし

takanaweb5👍を押しています

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

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

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

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

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

guest

回答5

0

ベストアンサー

どういうロジックで1回ずつ表示したいのかわかりません
とりあえずこんな感じ

javascript

1const sampleCode = ["03","04","32"]; 2if(['02','03','04','05','32','33','34','35'].some((v)=>sampleCode.includes(v))){ 3 console.log('テストAです'); 4} 5if(['02','03','04','05'].some((v)=>sampleCode.includes(v))){ 6 console.log('テストBです'); 7} 8if([,'32','33','34','35'].some((v)=>sampleCode.includes(v))){ 9 console.log('テストCです'); 10}

投稿2024/09/17 10:25

yambejp

総合スコア116629

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

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

aDGDy02001

2024/09/17 11:08

回答ありがとうございます!こちらでうまく理想形に返すことができました!
guest

0

filter以外にindexOf、includes、search、test、matchなどのメソッドでテストしてみたりしましたがうまくいきませんでした。

ループの中に書けば、そのたびごとに値を出力してしまいます。チェックした結果を変数に記録して、配列を回しきってから出力してはどうでしょうか。

投稿2024/09/17 09:52

maisumakun

総合スコア145956

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

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

aDGDy02001

2024/09/17 10:02

すみません、配列を回しきるとはどういうことでしょうか?
maisumakun

2024/09/17 10:51

ループの中で出力を行わず、ループが終わってから結果を見る、という意味です。
guest

0

次の様な感じでしょうか?

js

1const sampleCode = new Set(["03", "04", "32"]); 2const testA = new Set(['02','03','04', '05','32','33','34','35']); 3const testB = new Set(['02', '03', '04', '05']); 4const testC = new Set(['32','33', '34', '35']); 5if (testA.intersection(sampleCode).size) { 6 console.log('テストAです'); 7} 8if (testB.intersection(sampleCode).size) { 9 console.log('テストBです'); 10} 11if (testC.intersection(sampleCode).size) { 12 console.log('テストCです'); 13}

仕様については次を参照
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/intersection

対応状況は次のものを参照
https://caniuse.com/mdn-javascript_builtins_set_intersection

もしもそういう関数が欲しいとかであるならば次の様に書いてもいいかもしれません

js

1const sampleCode = ["03", "04", "32"]; 2function makeResults(settings) { 3 return function * (codes) { 4 const codes_ = new Set(codes); 5 for(const [set, result] of settings) { 6 if (set.intersection(codes_).size) 7 yield result; 8 } 9 } 10} 11const getResults = makeResults([ 12 [new Set(['02', '03', '04', '05', '32', '33', '34', '35']), 'テストAです'], 13 [new Set(['02', '03', '04', '05']), 'テストBです'], 14 [new Set(['32', '33', '34', '35']), 'テストCです'], 15]); 16 17for (const result of getResults(sampleCode)) 18{ 19 console.log(result); 20}

投稿2024/09/17 10:18

編集2024/09/17 10:21
juner

総合スコア483

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

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

aDGDy02001

2024/09/17 11:05

ありがとうございます。回答いただいたどちらとも試してみたのですが、なぜかログに何も返ってきませんでした…。
guest

0

この処理であれば集合にしてしまっても問題なさそうなので、こうするとどうでしょうか。

js

1 const sampleCode = ["03","04","32"]; 2 const sampleSet = new Set(sampleCode); 3 if (sampleSet.intersection(new Set(["02","03","04","05","32","33","34","35"])).size) console.log('テストAです') 4 if (sampleSet.intersection(new Set(["02","03","04","05"])).size) console.log('テストBです') 5 if (sampleSet.intersection(new Set(["32","33","34","35"])).size) console.log('テストCです')

投稿2024/09/17 10:03

Lhankor_Mhy

総合スコア36914

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

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

aDGDy02001

2024/09/17 10:15

回答ありがとうございます。 そのまま試してみたのですが、下記のようなエラーが出てしまいました。 TypeError: sampleSet.intersection is not a function. (In 'sampleSet.intersection(new Set(["02","03","04","05","32","33","34","35"]))', 'sampleSet.intersection' is undefined)
Lhankor_Mhy

2024/09/17 10:20

そうなんですね。 そのエラーメッセージが出るのであれば、ブラウザを最新版に更新した方がいいかもしれないですね。
aDGDy02001

2024/09/17 11:06

別のブラウザでチェックしたところエラーが出ずにうまくいっていました!
guest

0

※ 削除​​​
​​

投稿2024/09/17 10:53

編集2024/09/17 11:48
melian

総合スコア20590

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問