5

有没有办法从数组中删除一个对象?
(可能不使用 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变得依赖于实现。
假设我想从给定文件名的文件数组中删除一个文件。我必须通过更改标准再次编写“removeElement”。

也可能我可以改变标准吗?例子 :

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

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

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

谢谢大家。

4

4 回答 4

14

采用

if(array.indexOf(obj) != -1)
array.splice(array.indexOf(obj),1); 
于 2013-07-05T05:16:05.377 回答
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,除了它在原地工作。如果需要,您还可以为回调保留相同的接口(传递项目的索引和对原始数组的引用)以使其更加连贯。

于 2010-10-01T13:38:49.617 回答
2

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

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),但您当然可以自己跟踪它......

于 2012-02-28T06:32:44.927 回答
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;
}
于 2010-10-01T07:37:16.510 回答