sortOn()问题:复制数组排序时原数组同步排序的原因排查
问题原因与解决办法
嘿,这个问题我太熟了——你踩中了ActionScript 3里引用类型的经典坑!
你以为用var myArrayCopy = myArray as Array创建了数组副本,但实际上这根本没生成新数组,只是给同一个数组对象多起了个“别名”而已。AS3里数组属于引用类型,这类对象赋值时,复制的不是数据本身,而是指向内存中数组实例的“地址”。所以myArray和myArrayCopy其实指向的是同一个数组,你对其中任何一个做排序,另一个自然也会跟着变。
简单解释下原理:
- 像
int、String这种值类型,赋值时会直接复制数据; - 而
Array、自定义类实例这种引用类型,赋值只是拷贝指向对象的引用,两个变量共享同一个对象实例。
正确的数组拷贝方式
如果只是要一维数组的浅拷贝(或者二维数组但不需要拷贝子数组),用这两种方法就行:
slice(0):调用数组的slice方法并传入起始索引0,会返回一个包含原数组所有元素的新数组;concat():不带参数的concat方法会返回原数组的拼接副本,本质也是新数组。
要是你的二维数组需要深拷贝(连子数组也独立出来,避免修改副本的子数组影响原数组),就得遍历每个子数组单独拷贝:
修正后的代码示例
var myArray = [["stuff", "stuff"], ["stuff", "stuff"]]; // 方式1:浅拷贝二维数组(子数组还是引用) var myArrayCopy = myArray.slice(0); // 方式2:深拷贝二维数组(子数组也独立) // var myArrayCopy:Array = []; // for each(var subArr:Array in myArray) { // myArrayCopy.push(subArr.slice(0)); // } trace(myArray); // 输出未排序数组 trace(myArrayCopy); // 输出未排序数组 myArrayCopy.sortOn(1, Array.CASEINSENSITIVE); trace(myArray); // 依旧是未排序的原数组 trace(myArrayCopy); // 输出排序后的副本数组
这样修改后,myArrayCopy就是完全独立的数组了,排序操作只会影响它,原数组能保持初始状态。
内容的提问来源于stack exchange,提问作者Magnus Myrgård
相关产品推荐
相关产品推荐

