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

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

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

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

Q&A

解決済

2回答

1771閲覧

多次元配列の中身を検索したい

boniri

総合スコア18

JavaScript

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

0グッド

1クリップ

投稿2020/06/06 16:29

javascript

1var sample = [ 2 [0, 0], 3 [0, 1], 4 [0, 2] 5];

の配列があるとして、この配列の中に [0, 0]はあるか?を検索する方法が知りたいです。

javascript

1var sample1 = [1, 2, 3, 4]; 2sample1.includes(1) //=>trueが返ってくる

というのを知ったので、今回のケースでも使えるのかなと思ったのですが、

javascript

1 sample.includes([0, 0]); //=> falseが返ってきました。

という結果になったので、値渡しと参照渡しの違いが原因なのかなと思ったのですが、
うまく検索できませんでした。

多次元配列の中身を検索する方法を知っている方がいらっしゃいましたら、教えていただけると幸いです。

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

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

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

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

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

guest

回答2

0

配列のなかに[0,0]があるかを探索する方法は、配列のfindメソッドに述語(predicate)を記述することが考えられます。

JavaScript

1[[0,0],[0,1]].find(function(x){return Array.isArray(x) && x.length == 2 && x[0] == 0 && x[1] == 0}) 2Array [ 0, 0 ] 3 4[[1,1],[0,1]].find(function(x){return Array.isArray(x) && x.length == 2 && x[0] == 0 && x[1] == 0}) 5undefined

もし配列を検索するための述語が必要であればArrayクラスに以下のユーザー関数を追加すればよろしいかと思います。

JavaScript

1Array.isEqualTo = function(x){return function(y){if (!Array.isArray(y) || y.length != x.length) return false; for (let i = 0; i < x.length; i++) {if (x[i] != y[i]) return false;} return true;}}

使い方はこのような感じです。

JavaScript

1[[1,2,3],[4,5,6]].find(Array.isEqualTo([0,0,0])) 2undefined 3[[1,2,3],[4,5,6]].find(Array.isEqualTo([1,2,3])) 4Array(3) [ 1, 2, 3 ]

[追記]
Arrayのような組み込みオブジェクトの中身を書き換えることは、JavaScriptの言語仕様上可能なのですが、混乱を招くことがあるので推奨されないようです。プログラムの記述方法としては「文学的に優れている」ので私は興味深いし好きなのですが、職場やオープンソースなど複数人が使用するプロジェクト、また、jQueryなどのライブラリを多用するような場合には組み込みオブジェクトを書き換えないよう注意してください(組み込みオブジェクトを書き換える代わりにユーザー定義の関数かローカル変数に格納したり匿名関数の形で使用することが推奨されます)。

投稿2020/06/06 17:34

編集2020/06/07 00:10
anndonut

総合スコア667

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

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

boniri

2020/06/06 17:42

とても詳しく説明していただき、ありがとうございます、、! 自分でも実装してやってみます!
guest

0

ベストアンサー

値渡しと参照渡しの違いが原因なのかなと思った

はい、その通りです。
以下のように、同じ参照をもつ配列をArray.prototype.includes()を引数に渡すと、返り値はtrueになります。

javascript

1var sample = [ 2 [0, 0], 3 [0, 1], 4 [0, 2] 5]; 6var target = sample[0]; 7 8sample.includes(target); // true

boniriさんが望んでいることは、ある配列に含まれる要素すべてについて、別の配列に同じ順番で過不足なく含まれているかどうかを調べることだと思いますが、これをひとつのメソッドで実現することはできません。

細かい条件によって実装は変わりますが、今回は以下の要件でデモを実装しました。

  • 検索元の配列は2次元配列であること(配列の配列)
  • 末端の各配列の要素は、すべてnumberであること

細かいコメントはソースコードに書いてあります。

デモ

参考資料

投稿2020/06/06 17:35

NozomuIkuta

総合スコア1260

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

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

boniri

2020/06/06 17:41

とても詳しく説明していただき、ありがとうございます。参考資料もとても助かりました、、!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問