2011-11-18 26 views
7

Tôi thấy nó không quen thuộc với việc phân công mảng ActionScript bằng phương pháp tham chiếu. Tôi hiểu những gì nó đang làm, nhưng tôi bằng cách nào đó thấy nó khó hiểu để quản lý nhiều mảng với phương pháp này. Có cách nào đơn giản để làm việc với các mảng ActionScript trong đó gán mảng là bởi VALUE chứ không phải là REFERENCE? Ví dụ: nếu tôi muốn chỉ định oneArray cho twoArray mà không liên kết hai mảng với nhau mãi mãi trong tương lai, cách thực hiện? Điều này có hiệu quả không?ActionScript: Cách gán mảng theo VALUE thay vì REFERENCE?

var oneArray:Array = new Array("a", "b", "c"); 
var twoArray:Array(3); 
for (ii=0; ii<3; ii++) { twoArray[ii] = oneArray[ii]; } 

Mục đích là có thể thay đổi twoArray mà không thấy thay đổi trong oneArray.

Bất kỳ lời khuyên nào về cách gán mảng bằng VALUE thay vì REFERENCE?

---- để tham khảo ----

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html

mảng chuyển nhượng là bằng cách tham khảo chứ không phải theo giá trị. Khi bạn chỉ định một biến mảng cho biến mảng khác, cả hai tham chiếu đến cùng một mảng:

var oneArray:Array = new Array("a", "b", "c"); 
var twoArray:Array = oneArray; // Both array variables refer to the same array. 
twoArray[0] = "z";    
trace(oneArray);    // Output: z,b,c. 

Trả lời

5

Bạn có thể sao chép mảng để đảm bảo hai bản riêng biệt với các giá trị như nhau trong mỗi phần tử mảng:

var oneArray:Array = new Array("a", "b", "c"); 
var twoArray:Array = oneArray.concat(); 
twoArray[0] = "z"; 
trace(oneArray); // Output: a,b,c 

Hope đây là những gì bạn đang tìm kiếm.

+0

Chỉ cần nhận thấy câu trả lời của taskinoor, để theo đuổi bạn theo hướng của tôi, hehe, 'concat' thực sự nhanh gấp đôi 'slice' về nhân bản một mảng. :) – xLite

+1

Cảm ơn! Tôi đã nghiên cứu một chút và tìm thấy một vài liên kết hỗ trợ yêu cầu của bạn. Đây là một: http://agit8.turbulent.ca/bwp/2008/08/flash-as3-optimization-fastest-way-to-copy-an-array/ – ggkmath

+1

điều này sẽ chỉ tạo một bản sao nông. cho một bản sao sâu của một mảng, bạn phải sử dụng ByteArray để nhân bản mảng trong AS3: http: //help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html – TheDarkIn1978

10

Có vẻ như bạn đang tìm kiếm phương thức slice. Nó trả về một mảng mới bao gồm một loạt các phần tử từ mảng ban đầu.

var oneArray:Array = new Array("a", "b", "c"); 
var twoArray:Array = oneArray.slice(); 
twoArray[0] = "z";    
trace(oneArray); 

EDIT: Lưu ý rằng lát không phải là bản sao nông, không phải là bản sao sâu. Nếu bạn đang tìm kiếm một bản sao sâu thì hãy làm theo liên kết được chỉ định trong nhận xét.

+5

Dưới đây là một số thông tin về nhân bản sâu http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html –

+0

@ John Giotta, nhờ các liên kết. Tôi đã chỉnh sửa câu trả lời. – taskinoor

+0

Cảm ơn câu trả lời, và đặc biệt là sự khác biệt giữa nông và sâu nhân bản (Tôi không có ý tưởng). – ggkmath

0

Nếu tôi hiểu câu hỏi một cách chính xác, bạn có thể làm điều này:

var collection= new ArrayCollection(["a", "b", "c"]); 
var clonedCollection = new ArrayCollection(ObjectUtil.copy(collection.source) as Array); 

// a, b, c 
trace(collection.toString()); 
// a, b, c 
trace(clonedCollection .toString()); 

clonedCollection.removeItemAt(0); 

// a, b, c 
trace(collection.toString()); 
// b, c 
trace(clonedCollection .toString()); 
-2

Bạn có thể tạo một hàm clone để sao chép các đối tượng sử dụng ByteArray.writeObject và sau đó ra một đối tượng mới sử dụng ByteArray.readObject, như mô tả trong livedocs.adobe.com - Cloning arrays.

Lưu ý rằng writeObjectreadObject sẽ không hiểu các đối tượng phức tạp hơn ObjectArray.

Các vấn đề liên quan