这在我看来似乎很简单,但似乎无法获得正确的输出。我要做的就是遍历数据列表,并为对象属性分配另一个对象,例如
{
Foo: {
firstname: "sally",
lastname: "jenkins"
},
Bar: {
firstname: "john",
lastname: "smith"
}
}
但是,使用此代码,对象中的每个元素都被分配了相同的值。
let formInfo = {}
let spriteAndId = {}
forms.forEach((form) => {
spriteAndId["id"] = parseInt(form.pokemon.url.substr(form.pokemon.url.length - 6), 10);
spriteAndId["url"] = spriteUrlGen(spriteAndId["id"]);
formInfo[form.pokemon.name] = spriteAndId;
})
很抱歉,这很难理解,但它所做的就是为空对象spriteAndId分配一个url(“ https://example.com”)和id(1234)。变量形式是一个已经有数据的数组。
如果我在循环中记录spriteAndId,则每次迭代都会获得带有全新值的正确输出,但似乎只将这些迭代之一分配给父对象中的每个元素。
我认为也许我对forEach的理解不够好,所以我使用了for循环来实现它并获得了相同的结果。我无法理解为什么它将相同的对象分配给formInfo的所有值。
希望有人可以阐明我在这里所缺少的东西。提前致谢!
答案 0 :(得分:1)
const formInfo = Object.keys(form)
.map(obj => ({
[form[obj].name]: {
id: form[obj].id,
sprite: spriteUrlGen(form[obj].id)
}
}))
.reduce((prev, curr) => ({ ...prev, curr }, {}))
如果我理解您要实现的目标,则是一个最终形式的对象,其中将神奇宝贝的名称作为键,并将数据(sprite和Id)作为值。 Object.keys()返回对象所有属性的数组。您可以将它们映射到它们上并转换数据,在这种情况下,我们将返回一个以pokemon名称作为键和id,以sprite作为值的对象。请注意,[]
包含了对象的键,这是使值动态化的原因,否则,如果您编写硬编码键,则它将不起作用。
现在所有这些值都已映射/转换为对象,reduce函数将它们全部吸收并将其封装在单个对象中,从{}
空对象开始