Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS将对象分配给对象会导致重复的对象_Javascript_Arrays_Object - Fatal编程技术网

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

Javascript JS将对象分配给对象会导致重复的对象,javascript,arrays,object,Javascript,Arrays,Object,这在我的头脑中似乎很简单,但我似乎无法得到正确的输出。我所要做的就是遍历一个数据列表,然后用另一个对象指定一个对象属性,就像这样 { Foo: { firstname: "sally", lastname: "jenkins" }, Bar: { firstname: "john", lastname: "smith" } } 但是,使用此代码,对象中的每个元素都会被指定相同的值 let formInfo = {} let spriteAndId

这在我的头脑中似乎很简单,但我似乎无法得到正确的输出。我所要做的就是遍历一个数据列表,然后用另一个对象指定一个对象属性,就像这样

{
  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(“”)和id(1234)。变量forms是一个数组,其中已包含数据

如果我在循环中记录spriteAndId,我会在每次迭代中获得正确的输出和全新的值,但它似乎只将其中一次迭代分配给父对象中的每个元素

我想可能我对forEach理解不够,所以我使用for循环实现了它,并得到了相同的结果。我无法理解为什么它会将同一个对象分配给formInfo的所有值

希望有人能解释一下我在这里遗漏了什么。提前谢谢

    const formInfo = Object.keys(form)
     .map(obj => ({
          [form[obj].name]: {
            id: form[obj].id,
            sprite: spriteUrlGen(form[obj].id)
           }
     }))
     .reduce((prev, curr) => ({ ...prev, curr }, {}))
如果我理解了你想要实现的是一个最终的表单对象,它以口袋妖怪的名字作为键,数据(精灵和Id)作为值。key()返回对象所有属性的数组。您可以将它们映射到它们上面并转换数据,在本例中,我们将返回一个对象,其中pokemon名称为key,id为id,sprite为value。请注意包含对象键的
[]
,这是使值动态的原因,否则,如果您编写硬代码,键将无法工作。
现在所有这些值都已映射/转换为对象,reduce函数将它们全部包含在一个对象中,从
{}
空对象开始,对象值是对对象的引用。分配不会生成副本。将
spriteAndId
的初始化移动到循环内部。@Pointy在每次循环迭代中分配新值时,这是否有任何性能障碍?有时阵列中大约有400个项目。非常感谢你!我会马上测试的不;想一想,如果分配对象引用确实产生了副本,性能会是什么样子。@Pointy再次非常感谢您,这确实做到了,您已经清理了很多。当心你的位置。另一种做事的方式从来都不是坏事!我可以用这个来解决另一个类似的问题。非常感谢。