AS3一般从数组(对象)中删除元素

时间:2010-10-01 07:22:21

标签: actionscript-3 generic-programming

有没有办法一般从数组中删除一个对象?
(可能没有使用array.filter或创建新数组)

示例:

var arr:Array= new Array();    
//create dummy objs
for (var i:uint=0; i < 10; i++){
            var someObject:SomeClassObject = new SomeClassObject();
            someObject.Name ="Amit"+ i;
            someObject.Site="http://www.mysite.com/"+i;
           //...many more props
            arr.push(someObject);
 }
//
removeElement("Amit4",arr);
removeElement("Amit8",arr);
//...so on so forth

目前我正在使用array.splice()删除对象

for (var i:Number=0; i < arr.length; i++)
    {
        if (arr[i].Name == element)
        {
            arr.splice(i, 1);
        }               
    }

我想以这样的方式编写removeElement,我可以将它用于不同的方式 物体类型。
目前removeElement依赖于implmentation ..
假设我想从给定文件名的文件数组中删除文件。我必须这样做 再次通过改变标准来写“removeElement”。

也可能是我可以改变标准变量标准? 例如:

arr= removeElement("Site","http://www.mysite.com/6",arr)

将从“Site”属性等于“http://www.mysite.com/6”的arr中删除对象 (使用上面的例子)

ie. removeElement(criteria:object,criteria_value(s):object,arr)

全部谢谢。

4 个答案:

答案 0 :(得分:13)

使用

if(array.indexOf(obj) != -1)
array.splice(array.indexOf(obj),1); 

答案 1 :(得分:10)

我认为最灵活的方法是Array::filter后面的方法。由调用者决定是否应该通过函数回调来过滤列表中的项目。

现在,如果你想这样做,你可以编写一个这样的简单函数:

function remove(list:Array,callback:Function):Array {
    for(var i:int = list.length - 1; i >= 0; i--) {
        if(!callback(list[i])) {
            list.splice(i,1);
        }
    }
    return list;
}

这将返回列表,因为如果您想链接调用可能会很方便,但它会对您传递的数组起作用,而不是创建新数组。

另请注意,它会向后循环。否则,拼接会给你带来伪造的结果。

您可以像这样使用它:

var arr:Array = [1,2,9,10,455];
trace(arr);

function removeCallback(item:Number):Boolean {
    return item < 10;
}
remove(arr,removeCallback);
trace(arr);

这样您就不会受到平等(或不平等)的限制。调用者通过分别返回true或false来确定是保留还是删除项目(以匹配filter)。所以,它非常像filter,除了它就地工作。如果需要,您还可以为回调保留相同的接口(传递项目的索引和对原始数组的引用)以使其更加一致。

答案 2 :(得分:2)

顺便说一句,您可以使用字符串作为数组的索引,然后您可以安全地使用'delete'关键字从“中间”内部删除对象(在这种情况下实际上没有“中间”:)数组。
e.g:

var arr:Array = new Array();

arr['o1'] = new Object();
arr['o1'].someproperty = true;
arr['o2'] = new Object();
arr['o2'].someproperty = true;
arr['o3'] = new Object();
arr['o3'].someproperty = true;

trace (arr['o2'].someproperty);
//Returns 'true'
trace (arr['o2']);
//Returns '[object Object]'

delete arr['o2'];
trace (arr['o2']);
//Returns 'undefined'
trace (arr['o2'].someproperty);
//Returns 'TypeError: Error #1010: A term is undefined and has no properties.'

缺点是您将无法知道数组的长度(arr.length将返回0),但您可以自己跟踪它...

答案 3 :(得分:1)

这是一个通用功能,可以做你想要的:

public static function removeItem(array: Array, propertyName: String, value: String): Array
{
    var newArray: Array = [];
    for (var index: int = 0; index < array.length; index++) {
        var item: Object = array[index];
        if (item && item.hasOwnProperty(propertyName)) {
            if (item[propertyName] != value)
                newArray.push(item);
        }
    }
    return newArray;
}
相关问题