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

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

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

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

Q&A

解決済

2回答

7724閲覧

switch文で配列を扱いたいのですが、仕様がわかりません

tatatace

総合スコア2

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

0グッド

0クリップ

投稿2020/10/22 04:19

前提・実現したいこと

配列が特定の組み合わせになっているかどうかでswitch文を使って処理を分岐させたいのですがうまくいきません。

function test (){ var a = 1 var b = 2 var c = [a,b] console.log(c) switch (c) { case [1.2]: console.log("1") break; case 1.2: console.log("2") break; case 1,2:  console.log("3") break; case 12:  console.log("4") break; default: console.log("fail") }

caseの後ろに任意の配列パターンを指定時の表記方法がよくわかりません。
検索しても有意義な情報を見つけることができなかったので、正しい書き方を探る目的で、それっぽい書き方を思いつく限りのパターンでそれぞれ条件分岐させてコンソールに1,2,3,4のいずれかの番号、あてはまる条件がない場合はfalseと表示させるコードを書きました。

このようにしてログを確認すると変数cには[ 1, 2 ]という配列が確かに格納されているのにもかかわらずfailと表示されます。

おそらく基礎的な内容で躓いているものと思われますがどうしてもわからないので、switch文の分岐条件に配列を指定する方法を教えて下さい。

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

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

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

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

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

m.ts10806

2020/10/22 04:23

そもそもswitchもcaseも配列を渡すということ自体が間違いのように思いますが、なぜswitchなのでしょうか。
Lhankor_Mhy

2020/10/22 04:34

「failと表示されます」とのことですが、想定している結果はなんですか? --- そもそも JavaScript で配列の比較は難しいです。 [1,2]===[1,2] // false
tatatace

2020/10/22 04:46 編集

>>m.ts10806さん 複数の変数にそれぞれ格納されている数値を参照して条件分岐するコードを簡潔に書けると考えてswitchを選択しました。 はじめに、if式の分岐条件にa==1 && B==2を指定する方法を思いついたのですが、変数aとbの組み合わせのパターンが増えるとコードが複雑になって見た目が悪い上書くのに時間がかかるのではないかと考えた次第です。 どうやら誤りだったようですが、このような場合普通にifを使用するのがスタンダードなのでしょうか?
Zuishin

2020/10/22 04:50

私なら早期リターンを使うかもしれません。 const judge = (a, b) => { if (a === 1 && b === 2) return 'FizzBuzz'; if (a === 0) { if (b < 3) return 'Fizz'; else return 'Buzz'; } return 'Other'; }; switch (judge(a, b)) { case 'FizzBuzz': ...
tatatace

2020/10/22 04:58

>>Lhankor_Mhyさん 1、2、3、4、falseのいずれかです。 配列をcaseの条件にしたい場合の書き方がわからなかったのでそれっぽい書き方を列挙して、その中に正解の書き方があれば対応した1、2、3、4いずれかの番号がログに表示され、正解がなければfalseが表示されるので正しい書き方がわかります。 また正しい書き方が含まれなかった場合にこういったフォーラムで質問する際にこのコードを貼れば「これとこれとこの書き方は試しました」などのように書かなくていいので便利だと考えました。 どうやらswitchを使用するという前提自体が誤りだったようなので、存在しない正解を探してしまっていたようです。
Zuishin

2020/10/22 05:00

いずれにしてもこの質問は switch で配列を使用する方法を尋ねたものなので、質問を変更するのであればまずこちらをクローズして新しく立ててください。
tatatace

2020/10/22 05:03

>>Zuishinさん 「早期リターン」という概念を初めて知りました。勉強になります。 switchは今回のような目的に使用するのは不適切な様子なので、早期リターンの仕様も検討してみます。ありがとうございます。
guest

回答2

0

ベストアンサー

配列同士の比較では要素が同じであっても違うものとして扱われます。次のように確かめてください。

JavaScript

1console.log([1, 2] === [1, 2]);

文字列に直せば switch が使えます。

JavaScript

1const array = [1, 2]; 2switch (array.toString()) { 3 case '1,2': 4 console.log('[1, 2] です'); 5 break; 6 default: 7 console.log('ありません'); 8 break; 9}

投稿2020/10/22 04:38

Zuishin

総合スコア28669

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

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

Zuishin

2020/10/22 04:41

JSON.stringify([1, 2]) の場合は '[1,2]' になります。
tatatace

2020/10/22 05:13

とても勉強になりました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/10/22 05:17

やりたくない実装ですね^^; ['1', 2]とか想定するだけでもめんどくさそう。
Zuishin

2020/10/22 05:29

JavaScript 全般そんな感じですからね。整数のみ想定している関数に引数として小数送り込めたり文字列送り込めたり。 文字列が混入する可能性があるなら switch (array.map(a => Number(a)).toString()) とか更にその前にバリデーション通すとか default で対処するとか工夫が必要そうです。
退会済みユーザー

退会済みユーザー

2020/10/22 05:42

> JavaScript 全般そんな感じですからね。整数のみ想定している関数に引数として小数送り込めたり文字列送り込めたり。 あーまぁ確かに。 イレギュラーパターンが色々頭かすめたけど、フロントで動かす分には問題ない気がしてきたw
guest

0

こんにちは。

式が入力式の結果と評価される値が等しい最初の case 節を (厳密等価演算子 === を使用して) 探し

switch - JavaScript | MDN

補足依頼欄にも書きましたが、[1,2]===[1,2]は偽とされるので、配列の完全一致を判別するのは、意外と難しいです。

目的に合うかどうかわかりませんが、このようにしてみてはいかがでしょうか。

js

1switch (JSON.stringify(c)) { 2 case JSON.stringify([1,2]):

投稿2020/10/22 04:41

Lhankor_Mhy

総合スコア36960

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問