循环内的值不会改变
Value inside loop doesn't change
有人可以解释我如何更改模板.端口号值吗?
var template = {
portNumber: null,
stuff: ""
}
myfunc(template, 3);
function myfunc(template, count) {
var ports = {}
for (var i = 0; i < count; i++) {
var portNumber = i + 1;
ports[portNumber.toString()] = template;
ports[portNumber.toString()].portNumber = portNumber;
}
console.debug(JSON.stringify(ports, null, 4));
return ports;
}
结果:
"{
"1": {
"portNumber": 3,
"stuff": ""
},
"2": {
"portNumber": 3,
"stuff": ""
},
"3": {
"portNumber": 3,
"stuff": ""
}
}"
预期:
"{
"1": {
"portNumber": 1,
"stuff": ""
},
"2": {
"portNumber": 2,
"stuff": ""
},
"3": {
"portNumber": 3,
"stuff": ""
}
}"
很抱歉这个愚蠢的问题,但我真的坚持了下来。同样的代码在python中运行良好。谢谢。
您的数组最终具有对同一对象的三个引用,因此每次更改它时,更改在所有数组元素中都是可见的。
换句话说,书写ports[0].port = "99"
也会ports[1].port
变化,因为ports[0]
和ports[1]
是同一个对象。
您需要改为创建对象的副本...
所有数组对象都是引用类型的原因,因此仅指向一个实例。
尝试像这样使用构造函数。
var template = function(portno, stf){
this.portNumber = portno;
this.stuff = stf;
}
myfunc(template, 3);
function myfunc(template, count) {
var ports = {}
for (var i = 0; i < count; i++) {
var portNumber = i + 1;
ports[portNumber.toString()] = new template(portNumber , template.stuff);
}
console.debug(JSON.stringify(ports, null, 4));
return ports;
}
template
对象通过引用传递,因此所有项都引用同一对象。它最终看起来有点像这样:
template = {portNumber: 3, stuff: ""};
return {ports: {1:template, 2: template, 3: template}}
您需要克隆对象,然后进行设置。
var template = {
portNumber: null,
stuff: ""
}
myfunc(template, 3);
function myfunc(template, count) {
var ports = {}
for (var i = 0; i < count; i++) {
var portNumber = i + 1;
ports[portNumber] = JSON.parse(JSON.stringify(template));
ports[portNumber].portNumber = portNumber;
}
console.debug(JSON.stringify(ports, null, 4));
return ports;
}
此外,您无需手动字符串化数字键,它是自动完成的。
这是一个参考问题。
console.log(myFunc(template, 3));
function myFunc(template, count) {
var ports = {}
for (var i = 0; i < count; i++) {
var portNumber = i + 1;
ports[portNumber.toString()] = {portNumber:null, stuff:""};
ports[portNumber.toString()].portNumber = portNumber;
}
// console.debug(JSON.stringify(ports, null, 4));
return ports;
}
这是因为函数中的模板变量在函数外部保存模板对象的引用。试试这个:
function myFunc (template, count) {
var ports = {};
for(var i = 0; i < count; i++) {
var portNumber = i + 1;
var tmplt = JSON.parse(JSON.stringify(template));
tmplt.portNumber = portNumber;
ports[portNumber + ''] = tmplt;
}
return ports;
}
相关文章:
- 循环内的值不会改变
- jQuery在循环中改变这个的含义
- 为什么这个循环会改变每一轮中的所有值
- Javascript的右手值在循环中改变自身
- 如何制作改变起点的网站循环进度条
- 在不改变循环速度的情况下更改更新速度
- 循环的Javascript;t似乎正在改变'i'
- 当我执行循环时,AngularJs/Ajax索引正在改变
- 当我简单地改变两个表达式的顺序时,为什么这个for循环不能工作?
- For循环-改变src每个循环
- 在循环中使用setInterval来改变interval
- Javascript while或for循环,改变字符串直到满足条件
- 改变& lt; a>标签border-top's color菜单使用jQuery FOR循环
- 改变循环中元素的背景,然后改变悬停的颜色
- 为什么我的javascript不在这个while循环中改变bg的颜色?
- 改变img src属性值在循环- jquery
- 谷歌地图脚本-改变静态信息与变量从数据库循环
- 对于循环和动画,不能使用变量,因为由于闭包而改变
- Javascript for循环改变内容
- 动态改变循环的方向