2016-09-21 121 views
1

值我有以下几点:现在在一个循环中,所有的数组元素得到的最后一个

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个具有相同值{"left": 30, "top": 50}的元素。

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

任何想法如何解决这个问题?

+1

对象通过引用*传递*值,你只有一个单一的'点'对象,你继续推动,这是你唯一要改变的对象。 – adeneo

+1

您需要在迭代的每个步骤中创建一个新对象,然后将其推送到您的数组,现在您要推送同一个“点”变量的多个副本。 – slugo

+0

那么我该如何解决它?我试着添加var tmp = point;然后每次推动tmp而不是点,但结果是一样的。 – jovan

回答

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);

+0

这个技巧。我曾尝试每次宣布一个新的变种,但没有奏效。 – jovan

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); 
+0

这不是一个简单的选项,因为实际函数实际上并不仅仅是添加+3和+5,而是执行相当复杂的计算。所以我必须将整个代码粘贴到一个单独的函数中,并且每次调用它。一定会有更好的办法? – jovan

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); 
1

您可以根据自己计算出新的结果,你可以继续计数,像point,推动tjen一个新的对象和值。

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); 
相关问题