如何在actionscript 3中实现createuniqueCopy()?

时间:2011-03-26 07:18:53

标签: actionscript-3

我遇到了这个帖子:

Is there a function like array_merge in PHP in actionscript 3?

PHP 有一个内置函数可以执行此操作:

array array_merge  ( array $array1  [, array $array2  [, array $...  ]] )

似乎我需要包含 as3corelib 库才能使用createuniqueCopy

如何实现createuniqueCopy以减少swf的大小?

2 个答案:

答案 0 :(得分:0)

1)您不需要使用整个库,只需导入arrayUtils类: https://github.com/mikechambers/as3corelib/blob/master/src/com/adobe/utils/ArrayUtil.as

然后使用该功能: var c:Array = ArrayUtil.createUniqueCopy(a1.concat(a2));

  • 这将排除重复项,为了使重复项具有完全相同的值,只需删除:

    if(ArrayUtil.arrayContainsValue(newArray,item)){ 继续; }

来自createUniqueCopy函数的

一些例子: Cleanly merge two arrays in ActionScript (3.0)?

答案 1 :(得分:0)

我建议您使用ArrayUtil作为as3core库的一部分。该文件只有5kb,只包含一些功能,因此非常轻量级。如果你导入它,Flash足够聪明,只能包含它需要的文件,所以它不会从整个as3core库中引入所有代码。

另一方面,如果您真的想创建自己的,请执行以下操作:

var a1:Array = ["a", "b", "c"];
var a2:Array = ["b", "j", "e"];

var a3:Array = a1.concat(a2);
a3 = uniqueArray(a3);

trace(a3); // a,b,c,j,e

function uniqueArray(a:Array):Array {
    var newA:Array = [];
    for (var i:int = 0; i < a.length; i++) {
        if(newA.indexOf(a[i]) === -1) newA.push(a[i]);
    }
    return newA;
}

编辑(问题已在评论中澄清)

如果您使用关联数组,Adobe建议使用Objects,而不是Arrays用于关联数组。见http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html

  

Adob​​e 不要使用Array类创建关联数组(也称为哈希),它们是包含命名元素而不是编号元素的数据结构。要创建关联数组,请使用Object类。尽管ActionScript允许您使用Array类创建关联数组,但您不能将任何Array类方法或属性与关联数组一起使用。

所以,解决这个问题:

var a1:Object = {};
var a2:Object = {};

a1["a"] = "the a";
a1["b"] = "the b";
a2["b"] = "the b2";
a2["c"] = "the c";

var a3:Object = uniqueArray(a1, a2);

for each(var i:* in a3) {
    trace(i);
} 
// outputs [the a, the b, the c]
// 'the b2' is omitted because 'b' key already exists

function uniqueArray(a1:Object, a2:Object):Object {
    var newA:Object = {};

    for(var i:String in a1) {
        newA[i] = a1[i];        
    }
    for(var j:String in a2) {
        if(newA[j] === undefined) newA[j] = a2[j];
    }
    return newA;
}