Javascript,将对象推入for循环会产生重复的值

Javascript,将对象推入for循环会产生重复的值,javascript,jquery,object,Javascript,Jquery,Object,在for循环中,将对象推到另一个对象中有问题。它会产生重复的值。我假设问题是关于参考文献的: var controllers = ["Patrick","Alain"]; var steval = {"name":null,"prix":{max: 5, min: 3},"comments":null}; var evals = []; for (index = 0; index < co

在for循环中,将对象推到另一个对象中有问题。它会产生重复的值。我假设问题是关于
参考文献的

var controllers = ["Patrick","Alain"];
var steval = {"name":null,"prix":{max: 5, min: 3},"comments":null};

var evals = [];
for (index = 0; index < controllers.length; ++index) {
      var name = controllers[index];
      var eval = steval;
      eval.name = name;
      console.log(eval);
      evals.push(eval);
}
console.log(evals);
$("#json").html(JSON.stringify(evals));
var控制器=[“Patrick”,“Alain”];
var steval={“name”:null,“prix”:{max:5,min:3},“comments”:null};
var evals=[];
对于(索引=0;索引
结果如下:

我不明白的是,我的
console.log(eval)
返回正确的值,但显然
evals.push(eval)
总是推送相同的值

始终推送相同的值

因为代码中只有一个对象:
steval
。您只需更改该对象的
名称
属性

如果要创建多个对象,请在循环内创建该对象:

var控制器=[“Patrick”,“Alain”];
var evals=[];
对于(索引=0;索引
始终推送相同的值

因为代码中只有一个对象:
steval
。您只需更改该对象的
名称
属性

如果要创建多个对象,请在循环内创建该对象:

var控制器=[“Patrick”,“Alain”];
var evals=[];
对于(索引=0;索引控制台日志(evals)如另一个答案(信用到期)中所述,只有一个
steval
实例被更改和推送

您可以使用jquery(标记为jquery)将
deep
设置为true(因为您有嵌套对象)来“克隆”steval:

或者,您可以使用JSON stringify/parse生成克隆(或者将原始文件存储为JSON以跳过stringify部分),但这并不理想

var控制器=[“Patrick”,“Alain”];
var steval={“name”:null,“prix”:{max:5,min:3},“comments”:null};
var evals=[];
对于(索引=0;索引

如另一个答案(信用到期)中所述,只有一个
steval
实例被更改和推送

您可以使用jquery(标记为jquery)将
deep
设置为true(因为您有嵌套对象)来“克隆”steval:

或者,您可以使用JSON stringify/parse生成克隆(或者将原始文件存储为JSON以跳过stringify部分),但这并不理想

var控制器=[“Patrick”,“Alain”];
var steval={“name”:null,“prix”:{max:5,min:3},“comments”:null};
var evals=[];
对于(索引=0;索引

谢谢。我确实想过,但它觉得那样做不太好。是否有办法“克隆”该对象而不是简单地引用它?如果您使用嵌套对象,这不是一个简单的方法。我也不认为这样做有什么好处。“漂亮”是相对的。例如,我喜欢将相关代码放在一起,所以我更喜欢在需要的地方看到对象文字,而不是一些不太清晰的
克隆(someObject)
调用,我首先要找出什么是
someObject
。你说得没错,似乎更符合逻辑将数据与逻辑分开是一种常见做法,将
steval
放在方法中可能会使维护变得困难(而上面的评论认为它更容易维护,因为它就在那里)。另外,如果您碰巧想在多个地方使用它,那么在一个地方定义它是有意义的。取决于场景/首选项,在问题中这样的小片段中,它可能更容易与代码一起使用。@freedomn-m:当然,上下文就是一切。我们不知道数据到底是什么,动态和静态是什么,等等。这都是权衡。最终,一个合适的
可能是最好的解决方案。谢谢。我确实想过,但它觉得那样做不太好。是否有办法“克隆”该对象而不是简单地引用它?如果您使用嵌套对象,这不是一个简单的方法。我也不认为这样做有什么好处。“漂亮”是相对的。例如,我喜欢将相关代码放在一起,所以我更喜欢在需要的地方看到对象文字,而不是一些不太清晰的
克隆(someObject)
调用,我首先要找出什么是
someObject
。你说得没错,似乎更符合逻辑将数据与逻辑分开是一种常见做法,将
steval
放在方法中可能会使维护变得困难(而上面的评论认为它更容易维护,因为它就在那里)。另外,如果您碰巧想在多个地方使用它,那么在一个地方定义它是有意义的。取决于场景/首选项,在问题中这样的小片段中,它可能更容易与代码一起使用。@free
let eval = $.extend(true, {}, steval);