Я думаю, что наиболее гибкий подход - тот, за которым следует 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
, за исключением того, что оно работает на месте. При желании вы также можете оставить тот же интерфейс для обратного вызова (передавая индекс элемента и ссылку на исходный массив), чтобы сделать его более связным.