AS3 Удалить элемент из массива (объектов) в общем - PullRequest
4 голосов
/ 01 октября 2010

Есть ли способ вообще удалить объект из массива?
(возможно, не использовать 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)

удалит объект из arr, свойство «Site» которого равно «http://www.mysite.com/6" (используя приведенный выше пример)

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

Спасибо всем.

Ответы [ 4 ]

13 голосов
/ 05 июля 2013

Использование

if(array.indexOf(obj) != -1)
array.splice(array.indexOf(obj),1); 
10 голосов
/ 01 октября 2010

Я думаю, что наиболее гибкий подход - тот, за которым следует 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 голосов
/ 28 февраля 2012

Кстати, вы можете использовать строки в качестве индексов для массива, а затем вы можете безопасно использовать ключевое слово «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), но вы, конечно, можете отследить его самостоятельно ...

1 голос
/ 01 октября 2010

Вот общая функция, которая будет делать то, что вы хотите:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...