Grep проти фільтра в jQuery?


84

Мені було цікаво про відмінності між 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);
});

В обох ситуаціях я все ще можу отримати доступ до вихідного масиву ...

так ... де різниця?


4
Я думаю .grep(), що це допоміжний метод для загальної обробки масиву, в той час .filter()як зазвичай використовується для звуження виділення елементів. Я не думаю, що .grep()повертає об’єкт jQuery, і ви не можете його прив’язати ( jQuery.fn.grepне існує).
Фелікс Клінг,

2
$(arr).filter<- це непотрібно, зробіть arr.filterзамість цього.
Ман,

2
Мана не підтримали широко
Рої Намір,

Відповіді:


135

Вони обидва функціонують однаково, проте різняться за своїм звичаєм.

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


1
Просто хотів підкреслити, що .filter () не працює в IE, тому краще використовувати $ .grep () на випадок, якщо ваша програма підтримує всі браузери.
vohrahul

1
перевірив і виявив, що в даний час .filter () працює як в IE, так і в Microsoft Edge.
Umesh K.

19

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


Правда, звичайним використанням фільтра є передача рядка селектора. Ви також можете передати функцію фільтра, хоча аргументи (індекс, елемент) протилежні власній функції фільтра (елемент, індекс). Крім того, grep, схоже, дуже схожий на функцію фільтра власного масиву. Я підозрюю, що перевагою grep для jquery є сумісність із старими браузерами ...
Брайан Меттьюз

6

Різниця у його використанні:

Фільтр:

$(selector).filter(selector/function)

Греп:

$.grep(array,function,invert)

Так що у вашому випадку я вважав за краще б використовувати , grep()тому що з допомогою масиву таким чином , що не є необхідним: $(arr).

Я також вважаю, що ця grepфункція швидша, оскільки вона приймає лише масиви.


1

Для тих, хто цікавиться, як grepвиступає проти, filterя написав цей тест:

TLDR; Греп в рази швидший.

Сценарій, який я використовував для тестування:

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>


0

@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 фільтр трохи швидший, у хрому - все навпаки. Що стосується лише вистав, ви можете використовувати кого завгодно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.