実現したいこと
2つの多次元配列を比較し、配列の要素が一致していればtrueを返し、一致していなければfalseを返す関数の書き方について知りたいです
困っていること
純粋な配列であれば、比較する関数処理を書けるのですが、多次元配列のような配列の場合、どう比較し合う処理を書けば良いか分からずに困っています
js
1function compare(a, b){ 2 // 処理を書いていくのだが分からない... 3 return false; 4} 5// true 6const arrA = ["C", "E", ["B", "D", ["A"]]]; 7const arrB = ["C", "E", ["B", "D", ["A"]]]; 8console.log(compare(arrA, arrB)) 9// false: BとCの位置が異なっているため 10const arrC = ["C", "E", ["B", "D", ["A"]]]; 11const arrD = ["B", "E", ["C", "D", ["A"]]]; 12console.log(compare(arrC, arrD)) 13// false: Aが配列になっているかどうかを見ている 14const arrE = ["C", "E", ["B", "D", ["A"]]]; 15const arrF = ["C", "E", ["B", "D", "A"]]; 16console.log(compare(arrE, arrF))
JSON.stringifyを使った解
js
1// true 2const arrA = ["C", "E", ["B", "D", ["A"]]]; 3const arrB = ["C", "E", ["B", "D", ["A"]]]; 4console.log(JSON.stringify(arrA) == JSON.stringify(arrB)) 5// res: true 6 7// false: BとCの位置が異なっているため 8const arrC = ["C", "E", ["B", "D", ["A"]]]; 9const arrD = ["B", "E", ["C", "D", ["A"]]]; 10console.log(JSON.stringify(arrC) == JSON.stringify(arrD)) 11// res: false 12 13// false: Aが配列になっているかどうかを見ている 14const arrE = ["C", "E", ["B", "D", ["A"]]]; 15const arrF = ["C", "E", ["B", "D", "A"]]; 16console.log(JSON.stringify(arrE) == JSON.stringify(arrF)) 17// res: false
JSON.stringifyを利用すると求めている解を出すことができますが、JSONにして配列が一致しているかどうかを見るだけだとロジックを考える上であまり勉強にはならないため、考え方のロジックについてご教示いただけると幸いです。
配列の要素は、文字列のみですか?
数値や、オブジェクトを含む事はありますか?
(若干難易度変わる)
現在の質問では、「文字列」のみで回答の条件は満たせますが、出来れば、「数値や、オブジェクト」を含む形でご教示いただけると幸いです。
なお、「JSON.stringify」を使用しない方法でご教示いただけると嬉しいです。
> なお、「JSON.stringify」を使用しない方法でご教示いただけると嬉しいです。
この条件とその理由を質問に追記して下さい。
要素をシリアライズしてから一致することを確認するのは多くの言語で使用できる汎用的な考え方であり、
JSON.stringifyで出来るのに何を困って質問してるの?となるとともに、JSON.stringifyでは出来ない何か隠された要件がある場合には回答が無駄になってしまいます。
まず、ご自分でやってみたコードを記載してください。
今のままでは、丸投げになってしまっています。
質問に質問の意図を追記してみましたが、引き続き考えてみます。
otnさんの回答にある、再帰の概念については把握されていますか?
もし把握されていないのであれば
`リスト 走査 再帰`あたりで調べてみると、otnさんの回答が理解しやすいかと思います。
次元が不定の多次元データ構造を走査/操作する際によく使われる方法で、言語を問わず使われる概念です(使えない言語もあるとは思いますが)
@tanatさん
再帰関数というものは知っているのですが使い方について理解できていない状況です...(一旦、otnさんのヒントを元にやってみたいと思います。)
状況と質問意図について把握しました。
補足ありがとうございます。
再帰は取っ付きにくいですが、今回の質問内容には必須かと思います。
ありがとうございます。
関数内でLoopを回して、値がArrayだったら再帰関数を呼ぶようにして解決できました
(すみません、回答を見逃していたのでコメントを削除します)
回答4件
あなたの回答
tips
プレビュー