在循环中,所有数组元素都获得最后一个数组元素的值

时间:2016-09-21 13:55:51

标签: javascript

我有以下内容:

var travel_path=[];
var point={
    "left": 0,
    "top": 0
};
while(/*some condition here*/){
    point.left+=3;
    point.top+=5;
    travel_path.push(point);
}
console.log(travel_path);

现在,如果while循环运行10次迭代,而不是在每个元素中获得递增的lefttop值,我会得到10个具有相同值{的元素{1}}。

所以看起来,即使我使用push将元素追加到数组的末尾,它也会以某种方式更新所有以前的元素。

我有什么想法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

您可以使用Object.assign()在循环的每次迭代中创建对象的克隆,并将该对象推送到数组。



var travel_path = [];
var point = {
  "left": 0,
  "top": 0
};
var i = 0;

while (i++ < 5) {
  point.left += 3;
  point.top += 5;
  travel_path.push(Object.assign({}, point));
}
console.log(travel_path);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这就是javascript的工作原理。你可以这样做:

var travel_path = [];
var lastPoint;
var point = {
    "left": 0,
    "top": 0
};
while (/*some condition here*/) {
    lastPoint = travel_path[travel_path.length-1] || point;
    travel_path.push({
        left: lastPoint.left + 3,
        top: lastPoint.top + 5
    });
}
console.log(travel_path);

答案 2 :(得分:1)

试试这个:

var travel_path=[];
var point={
    "left": 0,
    "top": 0
};
while(/*some condition here*/){
    point.left+=3;
    point.top+=5;
    var tempPoint={
    "left": point.left,
    "top": point.top
    };
    travel_path.push(tempPoint);
}
console.log(travel_path);

答案 3 :(得分:1)

根据您计算新结果的方式,您可以保持计数,例如point,并使用值推送新对象。

var travel_path=[];
var point={
    left: 0,
    top: 0
};
while(/*some condition here*/){
    point.left += 3;
    point.top += 5;
    travel_path.push({ left: point.left, top: point.top });
}
console.log(travel_path);