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

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

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

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

Q&A

解決済

3回答

959閲覧

【Javascript】switchを使用して、配列の要素によって条件分岐するコードを記述したい。

kusoyarou

総合スコア1

JavaScript

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

0グッド

0クリップ

投稿2021/09/22 10:32

編集2021/09/22 10:43

実現したいこと

Javascriptにて、取得した配列の要素によって条件分岐するコードを、switchを使用して記述しようと考えています。

javascript

1const array = ['a', 'c',/*略*/]; 2switch () { 3 case /*リストにaが含まれている場合*/: 4 switch () { 5 case /*リストにcが含まれている場合*/: 6 //処理 7 break; 8 case /*リストにdが含まれている場合*/: 9 //処理 10 break; 11 } 12 break; 13 case /*リストにbが含まれている場合*/: 14 //処理 15 break; 16}

おおよそ以上のような形のコードは記述できましたが、肝心の式と値がわかりません。

考えたこと

式に以下の2つのどちらかを使用すればいいのではないかと考えました。

array.includes(); array.some();

arrayにwordが存在する時にwordの値はaである場合、処理を行う

といった意図のコードを記述したいと考え、

const array = ['a',/*略*/]; switch (array.some(word) == true) { case word = 'a': //処理 break; //略 }

といった記述をしましたが、エラーが出ました。
アドバイスをいただきたいです。
よろしくお願いいたします。

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

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

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

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

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

takasima20

2021/09/22 11:20

ちょっと、お望みの内容が伝わっていない気がします。 コードを書く前に仕様を再確認してみてはいかがでしょうか?
kusoyarou

2021/09/22 11:44 編集

わかりました。 switchで書こうと思った理由は、ifよりすっきりと書けそうだと思ったからで、それ以上の理由がありません。
hoshi-takanori

2021/09/22 23:45

switch は特定の値 (配列の i 番目の要素など) に応じて複数の分岐に分ける場合に使うのが普通です。 配列がある値を含むかどうか (結果は true または false) で分岐するには、 switch (array.includes(word)) { case true: ... で書けないことはありませんが、if を使ったほうがすっきりすると思います。
think49

2021/09/23 06:06

> ifよりすっきりと書けそうだと思ったからで 「書けそう」ではなくて、「書ける」と確信するまで switch 文の仕様理解に努めてください。 ・リファレンスを読む ・テストコードを繰り返し書く というようなswitch文の挙動理解にかける時間が足りてないのだと思います。 コードはイメージや感覚で書けるようにはなりません。
guest

回答3

0

switch 文

JavaScript

1switch (value1) { 2 case value2: 3 console.log('処理'); 4}

console.log('処理') が実行されるには、value1value2一致しなければなりません。

switch(true)

javascript

1const array = ['a', 'c',/*略*/]; 2switch () { 3 case /*リストにaが含まれている場合*/: 4 switch () { 5 case /*リストにcが含まれている場合*/: 6 //処理 7 break; 8 case /*リストにdが含まれている場合*/: 9 //処理 10 break; 11 } 12 break; 13 case /*リストにbが含まれている場合*/: 14 //処理 15 break; 16}

/*リストにaが含まれている場合*/array.includes('a') となり、aが含まれる場合の評価値は true になります。

JavaScript

1['a'].includes('a') === true;

switch() には true を入れる必要があるので、

JavaScript

1function sample(array) { 2 const results = []; 3 4 switch (true) { 5 case array.includes('a'): 6 results.push('a'); 7 8 switch (true) { 9 case array.includes('c'): 10 results.push('c'); 11 break; 12 case array.includes('d'): 13 results.push('d'); 14 break; 15 } 16 17 break; 18 case array.includes('b'): 19 results.push('b'); 20 break; 21 } 22 23 console.log(results); 24} 25 26sample(['a','b','c','d']); // ['a', 'c'] 27sample(['a','b','d']); // ['a', 'd'] 28sample(['b']); // ['b'] 29sample(['c','d']); // []

ただし、switch(true) には賛否両論があります。

一般によく見るコードは下記になり、

JavaScript

1switch () 2 case "値1": 3 // 処理1 4 break; 5 case "値2": 6 // 処理2 7 break; 8}

switch(true) は式と値の関係が逆転している為に、初見でコードを読むのに時間がかかる人もいます。

JavaScript

1switch ("値") 2 case1: 3 // 処理1 4 break; 5 case2: 6 // 処理2 7 break; 8}

私なら

switch(true) の私の評価は下記の通りです。

  • switch(true) よりif文の方が記述量が少ない
  • コードの解読に時間がかかる人がいる為、switch(true)を避けられるなら避けたほうが良い

質問文のコードなら、私は if 文でコードを書きます。

JavaScript

1function sample2(array) { 2 const results = []; 3 4 if (array.includes('a')) { 5 results.push('a'); 6 7 if (array.includes('c')) { 8 results.push('c'); 9 } else if (array.includes('d')) { 10 results.push('d'); 11 } 12 } else if (array.includes('b')) { 13 results.push('b'); 14 } 15 16 console.log(results); 17} 18 19sample2(['a','b','c','d']); // ['a', 'c'] 20sample2(['a','b','d']); // ['a', 'd'] 21sample2(['b']); // ['b'] 22sample2(['c','d']); // []

このコードが複雑に感じるようなら、コードではなくロジックに問題があります。
他のロジックでコードを組めないか、処理全体を見直します。

Re: kusoyarou さん

投稿2021/09/23 06:03

think49

総合スコア18189

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

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

0

自己解決

自己解決(?)しました。
if文で書き直しました。
加えて、実行しなかった理由に取り扱っていた配列がDOMTokenListだったため、someやincludesが作動しなかった事がわかりました。
ご協力いただいた方々には感謝申し上げます。

投稿2021/09/25 04:44

kusoyarou

総合スコア1

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

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

0

とりあえず、仕様が分からないので…
判定ごとに配列を探し回るのをさける方法を考えてみました。

javascript

1const array = ['a','b','c','d']; 2 3let ar2 = {}; 4for (x of array) ar2[x] = x; 5const ari = (ar,s)=>{return (typeof ar[s] !== "undefined");}; 6 7if (ari(ar2,'a')) { 8 if (ari(ar2,'c')) { 9 //処理 10 } else if (ari(ar2,'d')) { 11 //処理 12 } 13} else if (ari(ar2,'b')) { 14 //処理 15}

※組み合わせなど条件が違いましたら適宜アレしてください。

投稿2021/09/23 12:34

takasima20

総合スコア7464

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問