ネストされた配列のデータをJavaScriptオブジェクトに変換する方法
課題
まず、次のように「配列の中に配列が入った」ネストされたデータ構造があると仮定しましょう。
const arr = [
[
['dog', 'Harry'], ['age', 2]
],
[
['dog', 'Roger'], ['age', 5]
]
];
ここで求められているのは、このようなネストされた配列を受け取り、その内容をもとにオブジェクトの配列を作成するJavaScript関数を実装することです。
上記の配列に対して関数を実行した場合、期待される出力は以下のとおりです。
const output = [
{ dog: 'Harry', age: 2 },
{ dog: 'Roger', age: 5 }
];
実装例
実際のコードは次のようになります。
const arr = [
[
['dog', 'Harry'], ['age', 2]
],
[
['dog', 'Roger'], ['age', 5]
]
];
const prepareObjectArray = (arr = []) => {
const copy = arr.slice();
copy.forEach((el, ind, array) => {
el.forEach((element, index, subArray) => {
subArray[element[0]] = element[1];
});
el.length = 0;
array[ind] = Object.assign({}, array[ind]);
});
return copy;
};
console.log(prepareObjectArray(arr));
出力
コンソールには次のように表示されます。
[ { dog: 'Harry', age: 2 }, { dog: 'Roger', age: 5 } ]
コードの解説
この関数の処理の流れは以下のとおりです。
arr.slice()で元の配列のコピーを作成し、元のデータを破壊しないようにしています。- 外側の
forEachで犬ごとのグループを走査し、内側のforEachで[キー, 値]のペアを配列自身のプロパティとして動的に設定しています。 el.length = 0によって配列の要素をすべて取り除いた後、Object.assign()を使って配列をプレーンなオブジェクトへ変換しています。
よりシンプルな代替手法:Object.fromEntries()
ES2019以降で利用できる Object.fromEntries() を使うと、同じ処理をはるかに簡潔に記述できます。
const prepareObjectArray = (arr = []) =>
arr.map(pairs => Object.fromEntries(pairs));
console.log(prepareObjectArray(arr));
// [ { dog: 'Harry', age: 2 }, { dog: 'Roger', age: 5 } ]
各サブ配列が [キー, 値] 形式のペアを持っているため、そのまま Object.fromEntries() に渡すだけで自動的にオブジェクトへ変換されます。モダンなJavaScript環境では、こちらの方法を採用するのがおすすめです。
-
【JavaScript】配列内のネストされたオブジェクトの値を合計する方法
この記事では、JavaScriptを使って、配列内にネストされた(入れ子構造の)オブジェクトの値を合計する方法を解説します。サンプルコードでは、JSONデータの複数階層に格納された数値(costNum)を順番に取り出し、その合計をブラウザ上に表示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=d
-
JavaScriptでオブジェクトを新しい配列に変換する方法
JavaScriptでは、オブジェクトのプロパティやネストされたデータを取り出し、扱いやすい形で新しい配列にフォーマットできます。本記事では、学校(school)オブジェクトに含まれる生徒情報を、文字列形式の配列へ変換する実践的なコード例を紹介します。 ポイントとなるテクニック このサンプルでは、以下の2つのJavaScript機能を活用しています。 分割代入(Destructuring assignment):オブジェクトから特定のプロパティを簡潔に取り出す構文です。 for...of ループ:配列内の各要素を順番に処理するために使用します。 コード例 <!DOCTYPE html