Grep vs Filter в jQuery?
мне было интересно о различиях между Grep и Filter:
фильтр :
уменьшите набор совпадающих элементов до тех, которые соответствуют селектору или
пройдите тест функции.
например :
находит элементы массива, удовлетворяющие фильтру
функция. Исходный массив не затрагивается.
ОК.
Так что если я сделаю это в 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);
});
в обеих ситуациях я все еще могу получить доступ к исходному массиву...
так...в чем же разница ?
5 ответов:
Они оба функционируют аналогичным образом, однако они отличаются в их использовании.
функция фильтра предназначена для использования с элементами html, и именно поэтому это цепная функция, которая возвращает объект jQuery и принимает фильтры, такие как ":even",": odd" или ":visible" и т. д. Вы не можете сделать это с помощью функции grep, которая предназначена для служебной функции для массивов.
фильтр является частью jQuery.fn так что это цель должна использоваться с селектором
$('div').filterгде grep-это метод инструмента jQuery (jQuery.grep)
разница в его использовании:
фильтр:
$(selector).filter(selector/function)например:
$.grep(array,function,invert)так что в вашем случае я бы предпочел использовать
grep()потому что использование массива таким образом не нужно:$(arr).я тоже полагаю, что
grepфункция быстрее, потому что она принимает только массивы.
для тех, кто заинтересован, как
grepвыступает противfilterЯ написал этот тест:TLDR; Grep во много раз быстрее.
скрипт, который я использовал для тестирования:
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>
@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>TLDR: в firefox, фильтр немного быстрее, в chrome, это наоборот. Что касается выступлений только, вы можете использовать кого угодно.
Comments