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

【JavaScript】配列の文字列を分割して集計オブジェクトに変換する方法

JavaScriptでは、ハイフン(-)で区切られた文字列が格納された配列を、階層的なオブジェクトへと変換したいケースがあります。本記事では、reduce()メソッドとsplit()メソッドを組み合わせて、この変換をスマートに実現する方法を解説します。

課題となるデータ

まず、次のような文字列の配列を例に考えてみましょう。

const arr = [
    "fiat-palio",
    "fiat-stilo",
    "fiat-strada",
    "fiat-uno",
    "fiat-uno",
    "gm-corsa",
    "gm-celta",
    "ford-fiesta",
    "volkswagen-gol",
    "volkswagen-gol",
    "volkswagen-gol",
    "volkswagen-voyage"
];

この配列のすべての要素は「メーカー-モデル名」という形式になっており、ハイフン(-)を境に2つの部分に分かれています。

要件

ここで求められるのは、以下のような処理を行う関数です。

  • ハイフンの前半部分(メーカー名)をオブジェクトのキーとして扱う
  • 後半部分(モデル名)を入れ子になったオブジェクトのキーとする
  • 元の配列内で同じ組み合わせが出現した回数をカウントする

つまり、上記の配列を変換すると、期待される出力は次のようになります。

const output = {
    "fiat": {
        "palio": 1,
        "stilo": 1,
        "strada": 1,
        "uno": 2
    },
    "gm": {
        "corsa": 1,
        "celta": 1
    },
    "ford": {
        "fiesta": 1
    },
    "volkswagen": {
        "gol": 3,
        "voyage": 1
    }
};

「fiat-uno」は2回、「volkswagen-gol」は3回出現しているため、それぞれのカウントが反映されているのがわかります。

実装コード

この処理は、配列のreduce()メソッドを使うことで簡潔に実装できます。split('-')で各要素を分割し、キーの存在確認をしながらカウントを積み上げていきます。

const arr = [
    "fiat-palio",
    "fiat-stilo",
    "fiat-strada",
    "fiat-uno",
    "fiat-uno",
    "gm-corsa",
    "gm-celta",
    "ford-fiesta",
    "volkswagen-gol",
    "volkswagen-gol",
    "volkswagen-gol",
    "volkswagen-voyage"
];

const convertToObject = (arr = []) => {
    let res = arr.reduce((acc, val) => {
        let pair = val.split('-');
        let mark = pair[0];
        let model = pair[1];
        if (!acc.hasOwnProperty(mark)) {
            acc[mark] = {};
            acc[mark][model] = 1;
        } else {
            if (acc[mark].hasOwnProperty(model)) {
                acc[mark][model] += 1;
            } else {
                acc[mark][model] = 1;
            }
        }
        return acc;
    }, {});
    return res;
};

console.log(convertToObject(arr));

コードのポイント

  • reduce(): 配列を走査しながら単一のオブジェクト(初期値 {})を累積的に構築します。
  • split('-'): 各文字列をハイフンで分割し、メーカー名とモデル名を取り出します。
  • hasOwnProperty(): キーがすでに存在するかどうかを判定し、新規作成とカウントアップを切り替えています。

実行結果

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

{
    fiat: { palio: 1, stilo: 1, strada: 1, uno: 2 },
    gm: { corsa: 1, celta: 1 },
    ford: { fiesta: 1 },
    volkswagen: { gol: 3, voyage: 1 }
}

まとめ

reduce()split()を組み合わせることで、ハイフン区切りの文字列配列を階層構造を持つ集計オブジェクトへと効率的に変換できます。このパターンは、ログデータの集計やタグの分類など、実際の開発でも応用範囲が広いテクニックです。ぜひ活用してみてください。

  1. JavaScriptのObject.keys().map()とArray.map()の違いを徹底解説

    JavaScriptにおいて、Array.map()は配列の各要素に関数を適用し、その結果を新しい配列として返すメソッドです。一方、オブジェクトには直接map()メソッドが用意されていないため、Object.keys().map()という形で、まずObject.keys()を使ってオブジェクトのキーを配列として取得し、そこにmap()を適用するのが一般的なテクニックとなります。 この記事では、両者の使い方の違いを、実際に動作するサンプルコードと実行結果をもとにわかりやすく解説します。 サンプルコード 以下は、Object.keys().map()とArray.map()の動作を比較できるJa

  2. JavaScriptで配列内オブジェクトのプロパティ名を置き換える方法

    JavaScriptでオブジェクト配列のプロパティ名を置き換える方法 JavaScriptでは、map()メソッドを活用することで、配列に含まれる各オブジェクトのプロパティ名を別の名前に簡単に置き換えることができます。map()は元の配列を変更せずに新しい配列を生成するため、安全かつ効率的なデータ変換処理に適しています。 以下は、オブジェクト配列のプロパティ名 name を fullName に置き換えるサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta