我在将对象推入 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)
总是推送相同的值。
答案 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>