🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

配列

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

Q&A

解決済

3回答

1375閲覧

2つの配列の差分、もしくは同じかどうかを調べるには?

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

配列

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

0グッド

0クリップ

投稿2019/11/11 15:07

現在、2つの配列の操作に関して悩んでいます。以下のような配列があるとします。
配列arrA [0,2]
配列arrB [0,1,2]

配列arrBに関しては[1,0]や[2]と可変します。

理想は、配列の中の長さと数値が同じ(順番は気にしない)だった場合に「true」「false」と判別できればいいのですが、ちょっとわからないので差分があった場合ということでfilter関数を使って以下の処理をしました。

let result = arrB.filter(item =>
arrA.indexOf(item) == -1
);

こちらだと仮にarrB[0,1,2]となった場合は「1」が差分となりresultに値が入るので長さが0ではない=同じではないと判断したのですが、arrB[2]だけとなった場合にarrAと長さは違うものの検索対象となる配列arrBに「2」が一致して処理が終わるので、resultには何も入らないので配列の長さが0となってしまいます。

逆に検索対処の配列をarrAとしてみたのですがその場合だとarrBに含まれている数値にarrA[0,2]と値が入っていればarrB[0,1,2,3,4]でも差分がないと判断されてしまいます。
どう処理していいか、ご教授いただけると幸いです。

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

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

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

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

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

jun68ykt

2019/11/11 15:33

arrA と arrB は、たとえば [1, 2, 1 ] のように 、重複した要素を持つこともあり得ますか?
退会済みユーザー

退会済みユーザー

2019/11/11 15:35

どちらの配列も重複した値はあり得ないです。
jun68ykt

2019/11/11 15:51

重複した要素がないのであれば、既に回答されている方法でよいかと思います。
guest

回答3

0

ベストアンサー

js

1let result = JSON.stringify( arrA.concat().sort() ) === JSON.stringify(arrA.concat().sort() ); // 未テスト 2```とか 3```js 4let result = ( arrA.length === arrB.length ) && arrB.every( item => arrA.includes( item ) ); // 未テスト

【Array.prototype.every() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every

【Array.prototype.includes() - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

投稿2019/11/11 15:23

kei344

総合スコア69596

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

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

退会済みユーザー

退会済みユーザー

2019/11/11 16:19

おおお!期待通りの動きです。 ただ、concatをあいだに挟む理由がちょっとわからなかったです。 concatしないで、配列をsortで並び替えてSON.stringifyを用いて配列をJSON文字列に変換して比較していけました。 またeveryメソッドは初めてしったので、参考になります!
kei344

2019/11/11 16:49

> concat sortは元配列を破壊(ソート)するので、複製しています。
退会済みユーザー

退会済みユーザー

2019/11/11 23:38

ありがとうございます! あと、sliceでも破壊しないでいけるっぽいですね! この書きかたは参考になりました!
think49

2019/11/11 23:54

念の為、注意点としてJSON.stringifyは変換不可能なオブジェクトが存在するので、要素の格納値によっては相違を見逃します。 length+everyにはその問題はありません。
退会済みユーザー

退会済みユーザー

2019/11/12 02:57

thik49さん そうなんですね! このようなパターンの場合はlength+everyのほうがよさそうですね。 教えていただきありがとうございます。
guest

0

あまり考えずに回答しますが、その2つをfilter両方の結果を見れば良いのではないでしょうか?
両方差分が0なら仰る条件の下で同じものとして扱えると思います

投稿2019/11/11 15:18

175

総合スコア147

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

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

退会済みユーザー

退会済みユーザー

2019/11/11 15:41

filterを2回するという事でしょうかね。その2つのfilterの結果で2つとも配列が空==一致という事でしょうかね。
175

2019/11/11 15:53 編集

このfilterは要するに「自身の要素がすべて相手に含まれていれば0を返す」ということですよね。 であればお互いfilterが両方0なら「Aの要素はすべてBに含まれ、かつBの要素はすべてAに含まれる」ということで、お互い同じ要素のみで構成された配列だということになります。
退会済みユーザー

退会済みユーザー

2019/11/11 16:00

ありがとうございます。その方法で行けそうですね。 試してみます。
guest

0

両方をsortedして一致するか調べればいいのではないでしょうか。

投稿2019/11/11 15:22

otn

総合スコア85893

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

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

退会済みユーザー

退会済みユーザー

2019/11/11 15:46 編集

すいません。」ちょっとよくわからないですね 配列のsortは分かりますが、その一致方法が知りたいです
otn

2019/11/11 16:19

質問を取り違えているのかもしれませんが、 sorted(a)==sorted(b)
kei344

2019/11/11 17:49

To: otn さん それはPythonでは?
otn

2019/11/11 23:35 編集

失礼しました。勘違いです。 そうすると、ソートして、JSON.stringifyして、比較するというkei344さんの回答がわかりやすいですね。 読む人が一目でわかるという。
退会済みユーザー

退会済みユーザー

2019/11/11 23:39

ご回答ありがとうございます。 sortedが分からなかったんですが、pythonでしたか。 ありがとうございます!
otn

2019/11/11 23:43

多分、回答前に見ていた質問がPythonだったんだと思います。すみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問