Grep vs Filter в jQuery?

Мне было интересно узнать о различиях между Grep и Filter:

Фильтр:

Уменьшите набор согласованных элементов до тех, которые соответствуют селектору или выполните проверку функции.

Grep:

Находит элементы массива, которые удовлетворяют фильтру функция. Исходный массив не влияет.

ОК.

поэтому, если я делаю это в GREP:

var arr = [ 1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1 ];

myNewArray= jQuery.grep(arr, function(n, i){
  return (n != 5 && i > 4);
});

Я мог бы также:

 var arr = [ 1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1 ];

myNewArray= $(arr).filter( function(n, i){
  return (n != 5 && i > 4);
});

В обеих ситуациях я все еще могу получить доступ к исходному массиву...

так что... где разница?

Ответ 1

Оба они функционируют одинаково, однако они различаются по своим обычаям.

Функция фильтра предназначена для использования с элементами html, и именно поэтому она является связующей функцией, которая возвращает объект jQuery и принимает фильтры типа ": even", ": odd" или ": visible" и т.д. Вы не можете сделать это с помощью функции grep, которая предназначена для функции утилиты для массивов.

Ответ 2

Фильтр является частью jQuery.fn, поэтому его цель должна использоваться с селектором $('div').filter, где grep - это инструмент инструмента jQuery (jQuery.grep)

Ответ 3

Разница в использовании:

Фильтр:

$(selector).filter(selector/function)

Grep:

$.grep(array,function,invert)

Итак, в вашем случае я предпочел бы использовать grep(), потому что использовать массив таким образом не нужно: $(arr).

Я также предполагаю, что функция grep выполняется быстрее, поскольку она принимает только массивы.

Ответ 4

Для тех, кого интересует, как grep выполняет против filter, я написал этот тест:

TL;DR; Grep во много раз быстрее.

Script Я использовал для тестирования:

function test(){
var array = [];
for(var i = 0; i<1000000; i++)
{
array.push(i);
}

var filterResult = []
for (var i = 0; i < 1000; i++){
var stime = new Date();
var filter = array.filter(o => o == 99999);
filterResult.push(new Date() - stime);
}

var grepResult = [];
var stime = new Date();
var grep = $.grep(array,function(i,o){
return o == 99999;
});
grepResult.push(new Date() - stime);

$('p').text('average filter - '+(filterResult.reduce((pv,cv)=>{ return pv +cv},0)/1000))
$('div').text('average grep - '+(grepResult.reduce((pv,cv)=>{ return pv + cv},0)/1000))
}
test();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p></p>
<div></div>

Ответ 5

@Matas Vaitkevicius, опубликованный фрагмент кода представляет ошибки, здесь исправлен:

function test(){
var array = [];
for(var i = 0; i<1000000; i++)
{
    array.push(i);
}

var filterResult = []
for (var i = 0; i < 1000; i++){
    var stime = new Date();
    var filter = array.filter(o => o == 99999);
    filterResult.push(new Date() - stime);
}

var grepResult = [];
for (var i = 0; i < 1000; i++){
    var stime = new Date();
    var grep = $.grep(array,function(i,o){
        return o == 99999;
    });
    grepResult.push(new Date() - stime);
}

$('p').text('average filter - '+(filterResult.reduce((pv,cv)=>{ return pv +cv},0)/1000))
$('div').text('average grep - '+(grepResult.reduce((pv,cv)=>{ return pv + cv},0)/1000))
}
test();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<p></p>
<div></div>