Вы и мертвого из могилы подымите

Код AS3:
function isEmpty(value:Object):Boolean { return !value; }
function deleteIf(array:Array, predicate:Function):Array {
var i:int;
for (var j:int; j < array.length; j++) {
array[i] = array[j];
if (!predicate(array[j])) i++;
}
array.length = i;
return array;
}
function removeIf(array:Array, predicate:Function):Array {
var result:Array = [];
for each (var element:Object in array)
if (!predicate(element)) result.push(element);
return result;
}
removeIf([1, 0, 2, false, undefined, null, 3], isEmpty);
// [1, 2, 3]
deleteIf([1, 0, 2, false, undefined, null, 3], isEmpty);
// [1, 2, 3]
Есть такое явление "парадокс исследователя", это когда решение более общей проблемы делает решение ее часного случая более простым. Например, доказав, что рациональных не целых корней не бывает, мы очень просто можем доказать, что корень квадратный из двух - иррациональный.
Так и тут, проще решить проблему для общего случая: "удалить какие-то эелементы массива", а для конкретного: "удалить пустые эелементы" нам останется всего-навсего реализовать предикат распределяющий объекты на "те, которые надо удалять" и те, которые "не надо удалять".
Другой аспект этой проблемы: это очень важно, нужно ли создавать копию переданых данных, или нет. В практике более взрослых языков, это обычно отражается в названии функции (например, добавлением !), или в описании типа данных (изменяемые / не изменяемые). Но и в АС3, несмотря на то, что об этом редко задумываются, это, тем не менее, важно.
Алгоритмы удаления эелементов из массива были обсосаны сотни раз в любой книжке для начинающих, выше - тривиальная реализация, без потуг и претензий.