配列のリストからオブジェクトを作成したい。私はこのように見えると思われる動的な配列を持っています:
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: ...,
...
}
助けてください、ありがとう。
単に
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}), {})
例:
[
{ id: 10, color: "red" },
{ id: 20, color: "blue" },
{ id: 30, color: "green" }
].reduce((acc, cur) => ({ ...acc, [cur.color]: cur.id }), {})
出力:
{red: 10, blue: 20, green: 30}
仕組みは次のとおりです。
reduce
は空のオブジェクト(最後に空の{}
)で初期化されるため、最初の反復変数はacc = {}
cur = { id: 10, color: "red" }
です。関数はオブジェクトを返します。これが関数の本体が括弧=> ({ ... })
で囲まれている理由です。 Spread演算子は最初の反復では何もしませんので、red: 10
が最初のアイテムとして設定されます。
2番目の反復変数はacc = { red: 10 }
cur = { id: 20, color: "blue" }
です。ここで、スプレッド演算子expandsacc
と関数は{ red: 10, blue: 20 }
を返します。
3番目の反復acc = { red: 10, blue: 20 }
cur = { id: 30, color: "green" }
。したがって、acc
がオブジェクト内に拡散すると、関数は最終値を返します。
jsでes6を使用して配列の関数を減らす
let x = [1,2,3]
let y = x.reduce((acc, elem) => {
acc[elem] = elem // or what ever object you want inside
return acc
}, {})
console.log(y) // {1:1, 2:2, 3:3}