Javascript 对象数组反复包含相同的对象

Javascript 对象数组反复包含相同的对象,javascript,Javascript,我创建多个对象并将它们推送到数组objArr: var objArr=[]; var obj={}; 变量高度=[9,8,7,3,6,5,2,4]; 对于(变量i=0;i

我创建多个对象并将它们推送到数组
objArr

var objArr=[];
var obj={};
变量高度=[9,8,7,3,6,5,2,4];
对于(变量i=0;i<8;i++){
调试器;
var mountainH=高度[i];
obj.h=山;
obj.index=i;
目标推送(obj);
}
对于(变量i=0;i
  • obj
    的初始化放在
    for循环中
您正在将新值重新分配给全局变量
obj

var objArr=[];
变量高度=[9,8,7,3,6,5,2,4];
对于(变量i=0;i<8;i++){
调试器;
var obj={};
var mountainH=高度[i];
obj.h=山;
obj.index=i;
目标推送(obj);
}
对于(变量i=0;i}
因为代码中的
obj
的范围是全局的,应该包含在for循环中

如果不在循环内声明,则每次迭代时,该值将被相同的
obj
覆盖,而不是新的内存分配

var objArr=[];
变量高度=[9,8,7,3,6,5,2,4];
对于(变量i=0;i<8;i++){
调试器;
var mountainH=高度[i];
var obj={};
obj.h=山;
obj.index=i;
目标推送(obj);
}

控制台日志(obj)如前所述,您需要在循环的每次迭代中初始化一个新对象,否则所有数组成员只需共享同一个对象引用

此外,通过使用
.map()
构建数组,并完全使用对象文字初始值设定项声明属性,可以大大减少代码

var高度=[9,8,7,3,6,5,2,4];
var objArr=height.map((n,i)=>({h:n,index:i}));

控制台日志(objArr)因为你不是在创建一堆对象,只是在一遍又一遍地修改同一个对象。因为你在每次推送时都在重用相同的
obj
。因此,每次您通过执行
obj.h=…
对其进行变异时,它也会更改所有先前推送的。请尝试在循环内创建对象。值更新是通过引用进行的。您不应使用带有静态数字的for循环。如果更改了数组,则必须对其进行修改。使用
height.length
来避免无意义的问题我以前在JSFIDLE上尝试过这个,但后来整个网站都冻结了。@Black这很奇怪。可能你有更进一步的逻辑。你可能是对的,可能是后面的其他代码导致了冻结