0

我對我的javascript代碼中發生了什麼感到非常困惑。我正在嘗試編寫一個函數來創建一個隨機點數組。但是,當我將數組記錄到循環中(其功能是將數據添加到數組中),然後在循環外再次記錄它時,我得到兩個不同的數組。javascript - 數組在logging中顯示兩個不同的數組

第一個,如隨機X,Y點的列表所預測的那樣,但第二個日誌只包含最後輸入的X,Y點。

function Pick() 
{ 
    var numPoints = 4 * Math.floor(4+Math.random()*5); 
    var chosen_pts = []; 
    var lastPt; 
    for(var i = 0;i<numPoints;i++) 
    { 
     if(chosen_pts.length==0) 
     { 
      var temp = new Point(Math.floor(Math.random()*250),Math.floor(Math.random()*250)); 
      var newPt = pickClose(temp); 
      chosen_pts.push(newPt); 
      lastPt = newPt; 
     } 
     else{ 
      var newPt = pickClose(lastPt); 
      chosen_pts.push(newPt); 
      } 
     console.log(chosen_pts[i]); //LINE 106 

    } 
    console.log("\noutside of the loop:") 
    for(var i = 0;i<numPoints;i++) 
    { 
     console.log(chosen_pts[i]); //LINE 111 
    } 
} 

控制檯中看到的照片 Console Array 1 Console Array 2

編輯:

function pickClose(lastPt) 
{ 
     var x = lastPt["X"]; 
     var y = lastPt["Y"]; 
     var dx = 0; 
     var dy = 0; 
     var rand = Math.floor(1+Math.random()*100); 

     if(rand<50){ 
      dx = 1+Math.floor(Math.random()*10); 
      dy = 1+Math.floor(Math.random()*10); 
      if((dx+dy)%3==0){ 
       dx*=-1; 
      } 
     } 
     else if(rand<80) 
     { 
      dx = 1+Math.floor(Math.random()*25); 
      dy = 1+Math.floor(Math.random()*25); 
      if((dx+dy)%3==0){ 
       dy*=-1; 

      } 
     } 
     else{ 
      dx = 1+Math.floor(Math.random()*60); 
      dy = 1+Math.floor(Math.random()*60); 
      if((dx+dy)%4==0){ 
       dx*=-1; 
       dy*=-1; 

      } 
     } 
     if((x+dx) < 500&& (x+dx) >=0) 
      lastPt["X"]+=dx; 
     else 
      lastPt["X"]-=dx; 


     if((y+dy) < 500&& (y+dy) >=0) 
      lastPt["Y"]+=dy; 
     else 
      lastPt["Y"]-=dy; 

     return lastPt; 

    } 

看起來很凌亂,但本質上我想要一個不同的值範圍隨機從(DX,DY選擇)基於初始隨機數。

+1

的'pickClose'功能似乎是罪魁禍首。請包括它的源代碼。 –

+0

我不認爲這是問題,考慮到第一次'console.log'被稱爲它打印出不同的數字爲每個點 –

回答

0

pickClose函數總是返回傳入的元素。 JavaScript中的對象通過引用而被傳遞,因此稍後對該對象所做的任何更改也將應用於對所存儲對象的所有其他引用。

澄清:

var point1 = new Point(1, 2); 
var point2 = pickClose(point1); 
// inside pickClose, parameter lastPt = point1: 
    lastPt["X"] += dx; // <- this also alters point1! 
    lastPt["Y"] += dy; // <- this also alters point1! 

所以,如果你想返回一個Point自己的函數中(而不是改變傳遞的一個),你必須創建你改變,並返回一個新的對象:

var newX = x, newY = y; 
// instead of: 
lastPt["X"]+=dx; 
// do: 
newX += dx; 

// then, at the bottom, instead of 
return lastPt; 
// create a new instance 
return new Point(newX, newY); 
+0

謝謝你的工作 –

+0

@AaronGoldsmith沒問題!如果答案解決了您的問題,請將其標記爲已接受,因此它不會顯示爲「正在等待答案」。 –

0

你pickClose功能需要lastPt作爲參考,所以要修改已經是陣列中的點,然後重新添加。

試着改變你的行103:

var newPt = pickClose(new Point(lastPt.X, lastPt.Y));