JavaScriptで出現回数を考慮して2つの配列を比較する方法
同じ数の要素を持つ2つの配列があると仮定しましょう。ここでの課題は、両方の配列に同じ要素が同じ回数だけ含まれているかどうかを判定する関数を作成することです。
条件を満たしている場合は true を、満たしていない場合は false を返します。つまり、単に要素の種類だけでなく、各要素の出現回数まで一致している必要があります。
アプローチ
実装の方針は以下の通りです。
- まず、2番目の配列のコピーを
slice()で作成します(元の配列を変更しないため)。 - 1番目の配列を順に走査し、その過程で1番目の配列に存在する要素を、コピーした配列から削除していきます。
- 走査中に、コピー先の配列に存在しない要素に遭遇した時点で
falseを返します。 - 最後まで問題なく走査できれば、すべての要素が対応しているため
trueを返します。
要素を見つけるたびにコピー側から削除することで、出現回数の不一致も正しく検出できるのがポイントです。
コード例
const arr1 = [2, 5, 7, 4, 3, 3];
const arr2 = [3, 5, 7, 2, 3, 4];
const compareWithCount = (arr1, arr2) => {
if(arr1.length !== arr2.length){
return false;
};
const copy2 = arr2.slice();
const areEqual = arr1.every(el => {
if(!copy2.includes(el)){
return false;
};
copy2.splice(copy2.indexOf(el), 1);
return true;
});
return areEqual;
};
console.log(compareWithCount(arr1, arr2));
出力
コンソールには以下のように出力されます。
true
この例では、arr1 と arr2 の両方に 3 が2回含まれており、他の要素もすべて一致しているため、結果は true となっています。もし片方にしか存在しない要素や、出現回数が異なる要素があれば、結果は false になります。
-
【JavaScript】ネストされた配列の全要素数(ディープカウント)を求める方法
問題:ネストされた配列の全要素数を数える入れ子(ネスト)構造を持つ配列を受け取り、その中に存在するすべての要素の総数(ディープカウント)を返すJavaScript関数を作成します。入力const arr = [1, 2, [3, 4, [5]]];出力const output = 7;出力が7になるのは、第1階層に「1」「2」「[3, 4, [5]]」の3つ、第2階層に「3」「4」「[5]」の3つ、第3階層に「5」の1つの要素が存在し、入れ子の配列そのものも1つの要素としてカウントされるためです。すなわち 3 + 3 + 1 = 7 となります。サンプルコードconst arr = [1, 2
-
【JavaScript】配列内のすべての単語をメッシュ化して、つなぎの文字を取得する方法
問題 2つの単語は、最初の単語の末尾の部分文字列が次の単語の先頭の部分文字列と一致するとき、「メッシュ(連結)」できると言えます。たとえば、「robinhood」と「hoodie」は「hood」という部分でつながるため、メッシュ化が可能です。 この記事では、文字列の配列を受け取るJavaScript関数を作成します。配列内のすべての単語が順番にメッシュ化できる場合は、つなぎとなる共通部分を連結した文字列を返し、1組でもつながらないペアがあれば空文字列を返すようにします。 アルゴリズムの考え方 隣接する2つの単語をスペースで連結した文字列に対し、後方参照を使った正規表現 /(.+) \1/ を