2013-05-21 47 views
0

請檢查我的編碼:AS3 - 腳本錯誤在陣列

function createRandomList():void 
{ 
    var newlist:Array = [0,1,2]; 
    var curlist:Array = item[selectedlevel - 1] //selectedlevel = 1; 
    var normal:int = curlist[0]; 
    var tempboo1:Boolean = false; 
    var tempboo2:Boolean = false; 
    var tempboo3:Boolean = false; 
    while (curlist[0] + curlist[1] + curlist[2] > 0) 
    { 
     if (Number(curlist[0]) == 0 && tempboo1 == false) 
     { 
      newlist.splice(newlist.indexOf(0), 1); 
      tempboo1 = true; 
     } 
     if (Number(curlist[1]) == 0 && tempboo2 == false) 
     { 
      newlist.splice(newlist.indexOf(1), 1); 
      tempboo2 = true; 
     } 
     if (Number(curlist[2]) == 0 && tempboo3 == false) 
     { 
      newlist.splice(newlist.indexOf(2), 1); 
      tempboo3 = true; 
     } 
    var temp:int = Math.floor(Math.random()*(newlist.length)); 
    curlist[temp] -= 1; 
    generatedlist.push(Number(newlist[temp])); 
     trace(item); 
    } 

    while (normal > 0) 
    { 
     var temp2:int = Math.floor(Math.random() * 3) + 1; 
     generatednormal.push(Number(temp2)); 
     normal--; 
    } 
} 

我的項目是[[5,0,0],[10,0,0]]; 卻成了[[0,0,0],[0,0,0]];

我只想重複陣列項目是一個新的變量curlist之後。

每次追蹤時,返回item [0] [0]遞減1,我只想使用curlist作爲臨時數組來計算基於item [0]的新隨機數組。

輸出繼電器:

4,0,0,10,0,0 
3,0,0,10,0,0 
2,0,0,10,0,0 
1,0,0,10,0,0 
0,0,0,10,0,0 

他們之間有任何聯繫,或者是我的問題嗎?請幫忙!如果您需要更多信息,請評論我!

回答

0

如果你想創建一個新的引用,你可以克隆你的數組。

function clone(source:Object):* 
{ 
    var myBA:ByteArray = new ByteArray(); 
    myBA.writeObject(source); 
    myBA.position = 0; 
    return(myBA.readObject()); 
} 

var a:Array = [[0,0],[1,1]]; 
var b:Array = clone(a); 

b[0] = [2,2]; 

trace(a) 
trace(b) 

輸出

0,0,1,1 
2,2,1,1 

它適用於任何對象,不僅陣列。 更多信息在這裏:AS3 - Clone an object

+0

謝謝!那個函數真的起作用了 –

+1

對於任何人來說,這個答案磕磕絆絆 - 要知道這個方法比使用'.slice()'慢10-15倍左右。 – Marty

+1

當您的數組中沒有基元時,您的深度克隆方法會變得非常短暫。但對於數字等,這是一個簡單的解決方案,儘管如馬蒂所言,儘管速度很慢。 – Discipol

0
var array : Array = [ 1, 2, 3]; 
var array2 : Array = array.concnt(); 
array[ 0 ] = 4; 
trace(array);// 1, 2, 3 
trace(array 2);// 4, 2 ,3 

所以使用.concat()複製一個數組與基元。如果你有一個數組的數組。複製子數組,並將它們放入一個空的數組中。如果你有孩子數組等等,做一些遞歸的事情。

+0

你的答案有用,對不起,但我更喜歡RafH的回答。 –

+0

當然,請注意是否要添加Sprite等複雜對象。 RafH的方法會凍結您的應用程序和/或無法正常工作。 – Discipol

1

數組通過引用傳遞,而不是數值。這意味着當您通過指向它的任何屬性修改數組時,原始數組將被修改。

要進行重複的,你可以使用.slice()

返回一個新數組,它由一個範圍從原來的數組元素,而不修改原始數組。返回的數組包含startIndex元素和所有直到但不包括endIndex元素的元素。

如果您未傳遞任何參數,則新數組將是原始數組的重複(淺層克隆)。

+0

你的答案有用,對不起,但我更喜歡RafH的回答。 –

+0

@DanielCheung這很好,只是謹慎的開銷,這是沒有必要的。 '.slice()'專門用於複製數組。 – Marty