Функция filter выполняет переданную ей в качестве аргумента функцию для всех элементов массива и возвращает массив элементов, для которых функция вернула true. Она добавлена в стандарт JavaScript 1.6 core, однако большинство браузеров используют 1.5 core, следовательно эта функция для них недоступна. Самостоятельно создать эту функцию для класса Array можно следующим способом:
if ( !Array.prototype.filter ) {
Array.method('filter', function(fn, thisObj) {
var scope = thisObj || window;
var a = [];
for ( var i = 0, len = this.length; i < len; ++i ) {
if ( !fn.call(scope, this[i], i, this) ) {
continue;
}
a.push(this[i]);
}
return a;
});
}
В начале мы проверяем, объявлена ли эта функция в классе Array. Если нет, то добавляем её туда используя свойство prototype. Созданная функция принимает два аргумента: функцию-callback, которую нужно выполнять для каждого элемента массива и ссылку на объект, в контексте которого этот callback будет выполняться. В callback в свою очередь передаются три аргумента: текущий элемент массива, счетчик и ссылка на массив.
Пример
Выделение из массива всех строк:
var aList = [1, 3, "some string", true, "string two", null, false];
var res = aList.filter(function(value) {
if(value && value.constructor == String)
return true;
});
// массив res теперь содержит 2 элемента "some string" и "string two"
