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>