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

【JavaScript】オブジェクトの配列を配列のオブジェクトに変換する方法

問題の概要

JavaScriptでは、複数のオブジェクトを含む配列を、同じキーごとに値をまとめた「配列を持つオブジェクト」へ変換したいケースがあります。例えば、次のようなオブジェクトの配列があったとしましょう。

const nights = [
    { "2016-06-25": 32, "2016-06-26": 151, "2016-06-27": null },
    { "2016-06-24": null, "2016-06-25": null, "2016-06-26": null },
    { "2016-06-26": 11, "2016-06-27": 31, "2016-06-28": 31 },
];

ここで求められているのは、このような配列を受け取り、各オブジェクトのキーを基準に値をグループ化した「配列のオブジェクト」を生成する関数を作ることです。

つまり、上記の配列に対する期待される出力は以下のようになります。

const output = {
"2016-06-24": [null],
"2016-06-25": [32, null],
"2016-06-26": [151, null, 11],
"2016-06-27": [null, 31],
"2016-06-28": [31]
};

実装コード

この変換を行うコードは以下の通りです。

const nights = [
    { "2016-06-25": 32, "2016-06-26": 151, "2016-06-27": null },
    { "2016-06-24": null, "2016-06-25": null, "2016-06-26": null },
    { "2016-06-26": 11, "2016-06-27": 31, "2016-06-28": 31 },
];
const arrayToObject = (arr = []) => {
    const res = {};
    for(let i = 0; i < arr.length; i++){
        const keys = Object.keys(arr[i]);
        for(let j = 0; j < keys.length; j++){
            if(res.hasOwnProperty(keys[j])){
                res[keys[j]].push(arr[i][keys[j]]);
            }
            else{
                res[keys[j]] = [arr[i][keys[j]]];
            }
        }
    };
    return res;
};
console.log(arrayToObject(nights));

処理の流れ

この関数の動作を整理すると、次のような流れになります。

  • まず、結果を格納するための空のオブジェクト res を用意します。
  • 外側のループで入力配列の各オブジェクトを順に処理し、Object.keys() ですべてのキーを取得します。
  • 内側のループで各キーに対して hasOwnProperty() を使い、結果オブジェクトにそのキーがすでに存在するかどうかを判定します。
  • キーが存在すれば、既存の配列に push() で値を追加します。存在しなければ、新しい配列として値を登録します。
  • すべての要素の処理が完了したら、結果オブジェクトを返します。

実行結果

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

{
    '2016-06-25': [ 32, null ],
    '2016-06-26': [ 151, null, 11 ],
    '2016-06-27': [ null, 31 ],
    '2016-06-24': [ null ],
    '2016-06-28': [ 31 ]
}

なお、オブジェクトの文字列キーは挿入された順序を保持するため、元データの出現順に出力されます。日付順など特定の順序で並べたい場合は、Object.keys(output).sort() を使ってキーをソートするとよいでしょう。

  1. JavaScriptの型付き配列(Typed Array)とは?バイナリデータ操作の基本を解説

    JavaScriptの型付き配列は、配列のような振る舞いをするオブジェクトで、生のバイナリデータへ効率的にアクセスするための仕組みです。画像処理、音声処理、WebGLなど、パフォーマンスが求められる場面で活躍します。 通常の配列との違い 通常のArrayオブジェクトは要素の追加・削除によって動的にサイズが変化し、任意のJavaScriptの値を格納できます。JavaScriptエンジンはこうした配列に対しても最適化を行い、高速な動作を実現しています。 一方、型付き配列は扱えるデータの種類が固定されており、通常の配列とは明確に区別されます。注意: 型付き配列に対して Array.isArray(

  2. JavaScriptのlengthプロパティで配列オブジェクトの長さを取得する方法

    JavaScriptにおけるlengthプロパティとはJavaScriptのlengthプロパティは、文字列や配列などのオブジェクトが持つ要素数(サイズ)を返すために使用されます。配列の場合は格納されている要素の個数、文字列の場合は文字数を取得できます。ここでは、文字列と配列オブジェクトの長さをlengthプロパティで取得するサンプルコードを紹介します。サンプルコード以下の例では、ボタンをクリックすると配列の長さが画面に表示される仕組みを実装しています。<!DOCTYPE html> <html lang="ja"> <head> <