Javascript,将对象推入for循环会导致重复值

时间:2021-05-12 09:08:24

标签: javascript jquery object

我在将对象推入 for 循环内的另一个对象中时遇到问题。它导致具有重复的价值。我认为问题是关于 references:

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));

结果如下:

[{"name":"Alain","prix":{"max":5,"min":3},"comments":null},{"name":"Alain","prix":{"max":5,"min":3},"comments":null}]

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

2 个答案:

答案 0 :(得分:1)

<块引用>

总是推送相同的值

因为您的代码中只有一个对象:steval。您所做的就是更改该对象的 name 属性。

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

var controllers = ["Patrick","Alain"];
    
var evals = [];
for (index = 0; index < controllers.length; ++index) {
      var name = controllers[index];
      var eval = {"name": name,"prix":{max: 5, min: 3},"comments":null};
      evals.push(eval);
}
console.log(evals);


稍微紧凑一些:

var controllers = ["Patrick","Alain"];
        
var evals = controllers.map(name => {
  return {"name": name,"prix":{max: 5, min: 3},"comments":null};
});

console.log(evals);

答案 1 :(得分:1)

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

您可以使用 jquery 的 $.extend(作为标记的 jquery)“克隆”steval,并将 deep 设置为 true(因为您有嵌套对象):

let eval = $.extend(true, {}, steval);

或者,您可以通过 JSON 字符串化/解析来制作克隆(或将原始文件存储为 JSON 以跳过字符串化部分)——但这并不理想。

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];
      let eval = $.extend(true, {}, steval);
      eval.name = name;
      console.log(eval);
      evals.push(eval);
}
console.log(evals);
//console.log(JSON.stringify(evals));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>