从数组中创建对象

我想从数组中的列表创建一个对象。我有一个动态的数组,看起来像这样:

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: ...,
...
}

请帮帮忙,谢谢。

198653 次浏览

很简单

 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设置为第一个项。

在第二个迭代变量是 acc = { red: 10 } cur = { id: 20, color: "blue" }。这里的扩展运算符 膨胀 acc和函数返回 { red: 10, blue: 20 }

第三次迭代 acc = { red: 10, blue: 20 } cur = { id: 30, color: "green" },因此当 acc在对象内部展开时,函数返回最终值。

在 js 中使用 es6 reduce 函数 for array 我是这样做的

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}

来自 ECMAScript 2019的新 Object.fromEntries使得将数组中的值转换为对象中的键变得更加容易,如下所示

const dynamicArray = ["2007", "2008", "2009", "2010"];
const obj = Object.fromEntries(
dynamicArray.map(year => [year, {
something: "based",
on: year
}])
)


console.log(obj)

或者是为了解决你自己的问题

const width = 1920
const height = 1080
const dynamicArray = ["2007", "2008", "2009", "2010"];
const obj = Object.fromEntries(
dynamicArray.map((year, i) => [year, {
x: (( i + 1) / 5) * width,
y: height / 2
}])
)


console.log(obj)

var keys = ['key1', 'key2', 'key3']


var object = Object.assign({}, ...Object.entries({...keys}).map(([a,b]) => ({ [b]: 'someValue' })))
console.log(object)

这将产生

{ key1: 'someValue', key2: 'someValue', key3: 'someValue' }

我发现你实际上可以直接使用 Object.assign()和扩展运算符。不需要使用 reducemap函数引入更多的复杂性。

只要做 Object.assign(...yourArray, {}),你就会得到你想要的结果。 如果你想把你的对象数组合并到另一个对象中,那么你也可以调用 Object.assign(...yourArray, yourObject),它也可以正常工作。

你也可以使用同样的方法将两个数组合并成一个对象,即使其中一个数组不包含对象而只包含原始值——然而,如果你这样做,你需要确保至少有一个数组只包含对象,因为原始值将默认为其索引值 key,所以如果有一个重复的键,你会得到错误。

然而,对于运营商来说,没有出现这种错误的风险,因为他正在与一个空对象合并,这是最安全的方式。

const arr = [
{ a: 0 },
{ c: 1 },
{ e: 2 },
];


const obj = Object.assign({}, ...arr);


console.log(obj)


// Results to:
// Object { a: 0, c: 1, e: 2 }

使用 forEach

const arrayKeys=['KEY1','KEY2','KEY3'];
let object={};
arrayKeys.forEach((key)=>{
object[key]='property content'
});