JS将对象分配给对象会导致对象重复

时间:2018-07-16 16:59:40

标签: javascript arrays object

这在我看来似乎很简单,但似乎无法获得正确的输出。我要做的就是遍历数据列表,并为对象属性分配另一个对象,例如

{
  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的所有值。

希望有人可以阐明我在这里所缺少的东西。提前致谢!

1 个答案:

答案 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函数将它们全部吸收并将其封装在单个对象中,从{}空对象开始