内部循环的值不会改变

时间:2015-01-23 07:40:28

标签: javascript

有人可以解释一下如何更改 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中运行良好。 感谢。

5 个答案:

答案 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)

这是一个参考问题。

&#13;
&#13;
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;
&#13;
&#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;
    }