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);
});


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



так...в чем же разница ?

632   5  

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

    Ничего не найдено.