jQuery의 Grep 대 필터?


84

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

두 경우 모두 원래 어레이에 액세스 할 수 있습니다.

그래서 ... 차이점은 어디입니까?


4
일반적으로 요소 선택 범위를 좁히는 데 사용되는 .grep()반면 일반적인 배열 처리를위한 도우미 방법 이라고 생각 .filter()합니다. .grep()jQuery 객체를 반환 한다고 생각하지 않으며 연결할 수 없습니다 ( jQuery.fn.grep존재하지 않음).
펠릭스 클링

2
$(arr).filter<-이것은 불필요 arr.filter합니다. 대신하십시오.
Mahn 2014-06-18

2
MAHN 널리 지원되지 않습니다
Royi Namir에게

답변:


135

둘 다 비슷한 방식으로 작동하지만 사용법이 다릅니다.

필터 함수는 html 요소와 함께 사용하기위한 것이므로 jQuery 객체를 반환하고 ": even", ": odd"또는 ": visible"등과 같은 필터를 허용하는 체인 가능한 함수입니다. t는 배열을위한 유틸리티 함수 인 grep 함수를 사용하여 수행합니다.


1
.filter ()가 IE에서 작동하지 않는다는 것을 강조하고 싶었으므로 앱이 모든 브라우저를 지원하는 경우 $ .grep ()을 사용하는 것이 좋습니다.
vohrahul

1
테스트를 통해 현재 .filter ()는 IE와 Microsoft Edge에서 작동합니다.
Umesh K.

19

필터는 jQuery.fn의 일부이므로 $('div').filtergrep이 jQuery 도구 메서드 인 선택기와 함께 사용하는 것이 목표입니다 ( jQuery.grep).


사실, 필터의 일반적인 사용법은 선택자 문자열을 전달하는 것입니다. 인수 (인덱스, 항목)가 기본 필터 함수 (항목, 인덱스)와 반대이더라도 필터 함수를 전달할 수도 있습니다. 또한 grep은 기본 배열 필터 기능과 매우 유사한 것 같습니다. 나는 JQuery와에 대한 GREP의 장점은 이전 버전의 브라우저와의 호환성은 의심 ...
브라이언 매튜스

6

사용법의 차이 :

필터:

$(selector).filter(selector/function)

Grep :

$.grep(array,function,invert)

따라서 귀하의 경우에는 grep()배열을 사용하는 것이 불필요 하기 때문에 차라리 사용 $(arr)합니다.

또한 grep함수가 배열 만 받아들이 기 때문에 더 빠르다고 생각 합니다.


1

방법에 관심있는 것들에 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>


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 : 파이어 폭스에서는 필터가 약간 더 빠르며 크롬에서는 그 반대입니다. 공연에 관해서는 누구나 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.