JavaScriptで複数の配列の論理積(AND)を求める方法
はじめに
JavaScriptでは、真偽値を要素とする配列がネストした2次元配列を扱う場面があります。例えば、次のようなデータ構造です。
const arr = [[true, false, false], [false, false, false], [false, false, true]];
このような配列に対して、各サブ配列の同じ位置にある要素同士を論理積(&& 演算子)で結合し、結果を1つの1次元配列として返す関数を作成してみましょう。
つまり、すべてのサブ配列の1番目の要素同士、2番目の要素同士…というように対応する位置ごとに true かどうかを判定し、その結果をまとめた新しい配列を生成します。
実装方法:Array.prototype.reduce() を活用
この処理には、配列の集約処理に便利な Array.prototype.reduce() メソッドを使用します。初期値として空の配列を用意し、各サブ配列を順番に走査しながら、対応するインデックスの要素に対して論理積を適用していきます。
サンプルコード
const arr = [[true, false, false], [false, false, false], [false, false, true]];
const andMerge = (arr = []) => {
return arr.reduce((acc, val) => {
val.forEach((bool, ind) => {
acc[ind] = acc[ind] && bool || false;
});
return acc;
}, []);
};
console.log(andMerge(arr));コードの解説
reduce() のコールバック関数内では、アキュムレータ(acc)にこれまでの計算結果が保持されます。各サブ配列(val)を forEach() でループし、インデックス(ind) を使って対応する位置の要素と論理積を取ります。
なお、acc[ind] && bool || false という式は、最初の要素と比較する際に acc[ind] が undefined になるため、それを false として扱うための工夫です。これにより、未定義値による予期しない動作を防いでいます。
実行結果
このコードを実行すると、コンソールには次のように出力されます。
[ false, false, false ]
各位置の要素を見てみると、1番目は true && false && false、2番目は false && false && false、3番目は false && false && true となるため、すべて false になります。これは正しい結果です。
まとめ
このように reduce() と forEach() を組み合わせることで、ネストされた配列の対応する要素同士を簡単に結合できます。OR演算(||)で同様の処理を行いたい場合も、論理演算子を置き換えるだけで応用可能です。データのフィルタリングや条件判定など、さまざまな場面で活用できるテクニックなので、ぜひ覚えておきましょう。
-
【初心者向け】JavaScriptのFileとFileReaderを使ってファイルを読み込む方法
JavaScriptにおけるFileとFileReaderとは? JavaScriptでは、<input type=file>要素を使うことで、ユーザーにローカルファイルを選択させることができます。選択されたファイルはFileオブジェクトとして取得でき、ファイル名・サイズ・MIMEタイプなどの基本情報へアクセス可能です。 さらに、FileReaderオブジェクトを利用すれば、選択されたファイルの中身を非同期で読み込み、テキストやデータURLとして扱うことができます。 サンプルコード 以下は、JavaScriptでFileとFileReaderを使用して、ファイルの詳細情報を表示し
-
JavaScriptでfalsy値(偽と評価される値)を見分ける方法
JavaScriptにおけるfalsy値とはJavaScriptでは、値をBoolean型として評価したときに「false」とみなされる値がいくつか存在します。これらは「falsy値(偽の値)」と呼ばれます。条件分岐や論理演算において、意図しない動作を防ぐために、どの値がfalseと評価されるかを正しく理解しておくことが重要です。JavaScriptでfalseと評価される主な値は以下の通りです。false — Boolean型のfalseそのもの0 — 数値のゼロ空文字列:、、または ``(テンプレートリテラル)null — 値が存在しないことを示す特殊な値undefined — 値が未定義