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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3765閲覧

JavaScript 2つの配列を比較して、一方の配列の値に全て一致した場合に「true」を判定する条件

ArimaTetsuya

総合スコア12

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/03 02:19

編集2020/11/03 02:22

表題の通りなのですが、
2つの配列を比較して、一方の配列 (下記で言えば「arr2」) の全ての値が、
「arr1」に含まれている場合に「true」を判定する条件式を導きだすののに四苦八苦しています。

JavaScript

1var arr1 = ["a", "b", "c", "d", "e", "f", "g"]; 2var arr2 = ["a", "b", "c"];

自分でも下記の検索条件で色々と調査したのですが、
なかなか合致する解決策にたどりつけていません。

■Google検索
https://www.google.com/search?q=javascript+%E9%85%8D%E5%88%97%E6%AF%94%E8%BC%83

どうぞ宜しくお願いいたします。m(_ _)m

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

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

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

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

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

maisumakun

2020/11/03 02:24

・arr1・arr2に入りうる値は「文字列だけ」ですか?他のものも考えられますか? ・arr2に同じ項目が複数入っていた場合はどうしますか? ・動作環境はどのようなものを考えていますか?
ArimaTetsuya

2020/11/03 02:34

maisumakun さん ご質問ありがとうございます。 ・arr1・arr2に入りうる値は「文字列だけ」ですか?他のものも考えられますか? →文字列だけです。 ・arr2に同じ項目が複数入っていた場合はどうしますか? →arr2に複数入ることはありません。チェックボックでチェックしたvalueの値が入ります。 ・動作環境はどのようなものを考えていますか? →動作環境はWebブラウザ(PC・SP)で、チェックボックを使用したand検索をしようとしています。  ちなみに、arr1には、検索対象にdata属性で設定している、文字列値が入ります。 お手数おかけいたしますが、宜しくお願いいたします。
otn

2020/11/03 05:20

> なかなか合致する解決策にたどりつけていません。 > ■Google検索 検索結果の「配列の差分を取得する」ような記事が求める物です。 arry2 から arry1 を引いた差分が空の時に真にすればいいです。
ArimaTetsuya

2020/11/03 08:36

otn さん アドバイスありがとうございます。 そちらのロジックも今後考えてみます。 宜しくお願いいたします。
guest

回答2

0

基本的な指針としては Automatic9045 さんと同じです。

ループ内での評価結果として、arr2 と同じ配列(tmp)が作成できれば、配列長で判断できます。

  1. tmp を空の配列として初期化。
  2. for ループで比較し、arr2 のアイテムが arr1に含まれているならtmp.push()する。
  3. ループを抜けたあと、arr2tmp それぞれの配列長は同じ?

ループ内での評価用条件式 ary.indexOf(elm) > 0 の代わりに Array.prototype.includes() も使えます。

追記)解決されているようなので

javascript

1var arr1 = ["a", "b", "c", "d", "e", "f", "g"]; 2var arr2 = ["a", "b", "c"]; 3 4var tmp = []; 5for( str of arr2 ) { // for of を使う例 6 if( arr1.includes( str ) ) { // 条件式 7 tmp.push(str) 8 } 9} 10console.log( tmp ); // ["a", "b", "c"] 11console.log( tmp.length == arr2.length ); // true

発展になりますが、次のように、arr1 に arr2 の要素と同じ値が複数個含まれるときも考えて良いと思います。

javascript

1var arr1 = ["a", "b", "c", "d", "a", "e", "f", "g"]; // "a" が複数個ある例 2var arr2 = ["a", "b", "c"];

投稿2020/11/03 03:19

編集2020/11/03 03:29
AkitoshiManabe

総合スコア5434

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

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

ArimaTetsuya

2020/11/03 03:24

AkitoshiManabe さん ご回答ありがとうございます。 まだまだ理解できないところはありますが、 勉強していきます。 ありがとうございました。m(_ _)m
Automatic9045

2020/11/03 04:09

分かりやすさ重視の方法で回答しましたが、なるほど、そのように最適化することが出来るんですね。勉強になりました。
guest

0

ベストアンサー

こんにちは。

かなり調べても望むものが見つからなかったときは、自分で実装の仕方を考える他ありません。
私が実装するとしたら、
「arr2の各要素について、arr1に含まれているか調べる」
という方法をとると思います。

  • 配列の各要素について試行を実施し、全ての試行がtrueとなるか試すArray.prototype.every()関数
  • 配列内に特定の要素が存在するか調べるArray.prototype.indexOf()関数

この2つを組み合わせれば綺麗に書けます。

初学者のうちはforは非常に身近なためよく使いがちですが、forループで実装しようとするとどうしても直感的に理解しづらいコードになってしまいます。書いているご自身でも、自分が何を書いているのかよく分からなくなってしまっているのではないでしょうか。
今回提案したevery関数の他にも、find関数など、配列操作を可読性高く書くためのモダンな関数が沢山用意されているので、是非ご自分で調べてみて下さい。


##≪以下ネタバレ、出来る限りご自分で頑張ってみて下さい≫

JavaScript

1if (arr2.every(element => arr1.indexOf(element) != -1)) { 2 console.log("全部ありました"); 3}

投稿2020/11/03 02:33

編集2020/11/03 02:59
Automatic9045

総合スコア313

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

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

ArimaTetsuya

2020/11/03 02:42 編集

Automatic9045 さん ご回答ありがとうございます。 var arr1 = ["a", "b", "c", "d", "e", "f", "g"]; var arr2 = ["a", "b", "c"]; var arrCheck = false; for (var i = 0; i < arr1.length; i++) { if(arr2.indexOf(arr1[i]) >= 0) { arrCheck = true; break; } } return arrCheck; 上記の記述で試したのですが、なかなかうまく行かず、、、。 勉強が足りないです。
maisumakun

2020/11/03 02:45

> 上記の記述で試したのですが、なかなかうまく行かず、、、。 arr1とarr2が逆ではないでしょうか?
Automatic9045

2020/11/03 02:55 編集

(削除) --追記-- 変なことを書きました。このコメントは誤りです。失礼しました。 とはいえ、これだと動きません。 スマートな方法について追記しておきます。
ArimaTetsuya

2020/11/03 02:51

maisumakun さん ありがとうございます。 逆にしましたができませんでした。 Automatic9045 さん ご確認ありがとうございます。
ArimaTetsuya

2020/11/03 02:59

Automatic9045 さん 追記ありがとうございます。(ネ◯バレもありがとうございます。) 直ぐに試してみます。 宜しくお願いいたします。
ArimaTetsuya

2020/11/03 03:07

Automatic9045 さん 解決できました。 ありがとうございました。m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問