JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで配列を反復処理し、連続する「t」(true)の出現回数をカウントする方法

データベースから取得した、't'(真)と 'f'(偽)で構成される真偽値の配列を想定してみましょう。たとえば次のような配列です。

const arr = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'];

ここでの課題は、このような配列を引数に受け取る JavaScript 関数を作成することです。作成する関数は、'f' によって区切られた 't' の連続出現回数を数え、その結果を配列として返す必要があります。

上記の配列の場合、期待される出力は次のとおりです。

const output = [1, 3, 6, 1];

コード例

この処理を実装すると、次のようになります。

const arr = ['f', 't', 'f', 't', 't', 't', 'f', 'f', 't', 't', 't', 't', 't', 't', 'f', 't'];
const countClusters = (arr = []) => {
    let res = [];
    res = arr.reduce((acc, val) => {
        const { length: l } = acc;
        if(val === 't'){
            acc[l - 1]++;
        }
        else if(acc[l - 1] !== 0){
            acc.push(0);
        };
        return acc;
    }, [0]);
    return res;
};
console.log(countClusters(arr));

実行結果

コンソールには次のように表示されます。

[ 1, 3, 6, 1 ]

コードの解説

このソリューションの鍵となるのは Array.prototype.reduce() です。初期値としてカウンター入りの配列 [0] を用意し、各要素を順番に処理していきます。

  • 要素が 't' の場合:累積配列の末尾にあるカウンターを +1 し、現在進行中の連続区間の長さを更新します。
  • 要素が 'f' の場合:直前のカウントが 0 でなければ、新しいカウンター 0 を追加して次の区間の集計に備えます。この条件のおかげで、'f' が続いても余計なゼロが挿入されません。

こうして、't' の連続ブロック(クラスター)ごとの個数だけを格納した配列が完成します。配列の先頭や末尾にある 't' も同様にカウントされるため、両側を 'f' で完全に挟まれていない区間も含めて正しく集計できる点が特徴です。

  1. 【初心者向け】JavaScriptのreverse()メソッドで配列を逆順にする方法

    JavaScriptのreverse()メソッドは、配列の要素を元の順序と逆順に入れ替えるための便利な関数です。このメソッドを呼び出すと、配列の最初の要素が最後に、最後の要素が最初に移動し、配列全体が反転されます。reverse()メソッドの基本reverse()は配列そのものを変更する「破壊的メソッド」である点に注意してください。つまり、元の配列の順序が直接書き換えられます。元の配列を保持したい場合は、あらかじめslice()やスプレッド構文([...arr])などでコピーを作成してからreverse()を使用するのがおすすめです。サンプルコード以下は、ボタンをクリックすると配列の要素が逆順

  2. JavaScriptにおける配列の分割代入(Destructuring)の基本と使い方

    分割代入(Destructuring)とは、配列から値を取り出して個別の変数に展開するための構文です。ES2015(ES6)で導入されたこの機能を使うと、配列の各要素を簡潔かつ読みやすく変数に割り当てることができます。 配列の分割代入のサンプルコード 以下は、JavaScriptで配列の分割代入を行うコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport&quo