簡體   English   中英

AS3操縱多維數組

[英]AS3 manipulation of multidimensional array

美好的一天 :)

為什么當我編輯hold:Arrayarray:Array也被編輯了?

舉個例子:

function func(2, 2) { //x, y COORDINATE
   var hold = array[2]; //GET COLUMN OF ARRAY
   hold[2] = 2;         //SET hold[x] to 2
   trace(array[2][2])   //SAME AS hold[x] *but i didn't change array[x]'s value!*
}

逐步分析

array []看起來像這樣(例如):

1,1,1,1
1,1,1,1
1,1,1,1
1,1,1,1

因此, var hold = array[y] :(其中y = 2)

1,1,1,1

hold[x] = 2 (其中x = 2)

1,2,1,1

現在,跟蹤array[y][x] (其中y = 2,x = 2)

1,2,1,1

但是array[2][2]應該是1,1,1,1 ,因為我們沒有編輯它的值!

問題為什么我只編輯hold[]時會編輯array[] hold[]

這是因為數組(typeof將賦予Object)通過引用傳遞。 要復制其值,您需要在ActionScript中克隆數組

以下是 ActionScript 2.0 的解釋 (也適用於ActionScript 3.0,但我找不到本文的版本)。

是的,數組作為參考存儲在變量中。 這意味着當您創建數組array然后將其存儲為hold以創建2D數組時,您只需在hold存儲對array的引用。

例如,您可能希望如果您在一個數組中存儲了一個Sprite,然后編輯了該Sprite的值,那么您可以從其他任何引用Sprite的地方看到這些更改。 這對於數組來說是一樣的。

var array:Array = [];
var another:Array = [];
var sprite:Sprite = new Sprite();

array.push(sprite);
another.push(sprite);

array[0].x = 10;
trace(another[0].x); // Also 10.

如果您不想要此行為,可以使用.slice().concat()來生成數組的淺層克隆:

array.push(hold.slice()); // or
array.push(hold.concat());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM