有人可以解释一下如何更改 template.portNumber 值吗?
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中运行良好。 感谢。
答案 0 :(得分:3)
您的数组最终会对同一个对象进行三次引用,因此每次改变它时,所有数组元素都会显示更改。
另外,写ports[0].port = "99"
也会更改ports[1].port
,因为ports[0]
和ports[1]
是完全相同的对象。
您需要创建对象的副本......
答案 1 :(得分:3)
所有数组对象都是引用类型的原因,因此只指向一个实例。
尝试使用像这样的构造函数。
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;
}
答案 2 :(得分:1)
template
对象通过引用传递,因此所有项都引用同一个对象。最终看起来有点像这样:
template = {portNumber: 3, stuff: ""};
return {ports: {1:template, 2: template, 3: template}}
您需要clone the object,然后进行设置。
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;
}
此外,您不需要手动字符串化数字键,它会自动完成。
答案 3 :(得分:0)
这是一个参考问题。
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;
}
&#13;
答案 4 :(得分:0)
这是因为函数中的模板变量保存了函数外部模板对象的引用。 试试这个:
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;
}