[英]AS3 manipulation of multidimensional array
美好的一天 :)
為什么當我編輯hold:Array
, array: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中克隆數組 。
是的,數組作為參考存儲在變量中。 這意味着當您創建數組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.