代码之家  ›  专栏  ›  技术社区  ›  Amitd

as3一般地从数组(对象)中移除元素

  •  4
  • Amitd  · 技术社区  · 15 年前

    是否有方法从数组中一般删除对象?
    (可能不使用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);
            }               
        }
    

    我想以这样一种方式来写removelement,我可以用它来改变 对象类型。
    目前,移除依赖于实施。
    假设我想从给定文件名的文件数组中删除一个文件.. 通过更改条件再次写入“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 回复  |  直到 11 年前
        1
  •  10
  •   Juan Pablo Califano    15 年前

    我认为最灵活的方法是 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 )所以,这很像 滤波器 除非它在适当的地方工作。如果需要,还可以为回调保留相同的接口(传递项的索引和对原始数组的引用),以使其更加一致。

        2
  •  13
  •   Abin Mathew Abraham    11 年前

    使用

    if(array.indexOf(obj) != -1)
    array.splice(array.indexOf(obj),1); 
    
        3
  •  2
  •   Yuval A.    14 年前

    另外,可以使用字符串作为数组的索引,然后可以安全地使用“delete”关键字从数组的“middle”(在这种情况下实际上没有“middle”)中删除对象。
    例如。:

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

        4
  •  1
  •   splash    15 年前

    下面是一个通用函数,它可以满足您的需要:

    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;
    }