配列内のリストからオブジェクトを作成したいです。動的な配列があり、次のようになります。
var dynamicArray = ["2007", "2008", "2009", "2010"];
そして、JavaScript ES6 を使用して次のようなオブジェクトを作成したいと思います。
const obj = {
2007: {
x: width / 5,
y: height / 2
},
2008: {
x: (2 / 5) * width,
y: height / 2
},
2009: {
x: (3 / 5) * width,
y: height / 2
},
2010: {
x: (4 / 5) * width,
y: height / 2
}
}
内部のオブジェクトについては心配しないでください。次のような構造を作成したいだけです。
obj = {
2007: ...,
2008: ...,
...
}
ベストアンサー1
単に
const obj = {};
for (const key of yourArray) {
obj[key] = whatever;
}
または、「機能的な」スタイルを好む場合:
const obj = yourArray.reduce((o, key) => Object.assign(o, {[key]: whatever}), {});
最新のオブジェクトスプレッド演算子を使用します。
const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})
例:
console.log(
[
{ id: 10, color: "red" },
{ id: 20, color: "blue" },
{ id: 30, color: "green" }
].reduce((acc, cur) => ({ ...acc, [cur.color]: cur.id }), {})
);
仕組みは次のとおりです:
reduce
は空のオブジェクト({}
最後は空)で初期化されるため、最初の反復変数は ですacc = {}
cur = { id: 10, color: "red" }
。関数はオブジェクトを返します。これが関数本体が括弧で囲まれている理由です=> ({ ... })
。スプレッド演算子は最初の反復では何もしないため、 がred: 10
最初の項目として設定されます。
2回目の反復では変数は ですacc = { red: 10 }
cur = { id: 20, color: "blue" }
。ここでスプレッド演算子拡大する acc
関数は を返します{ red: 10, blue: 20 }
。
3 回目の反復acc = { red: 10, blue: 20 }
cur = { id: 30, color: "green" }
で、acc
がオブジェクト内に広がると、関数は最終値を返します。