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

これは、呼び出しを連鎖させたい場合に便利なリストを返しますが、新しい配列を作成する代わりに、渡した配列に作用します。

逆方向にループすることにも注意してください。そうしないと、 splice によって偽の結果が得られます。

次のように使用できます。

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 に答える