jQueryのGrepとフィルター?


84

GrepとFilterの違いについて疑問に思っていました:

フィルター:

一致する要素のセットを、セレクターに一致する要素または関数のテストに合格する要素に減らします。

Grep:

フィルタ関数を満たす配列の要素を検索します。元の配列は影響を受けません。

OK。

したがって、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存在しません)。
Felix Kling 2012

2
$(arr).filter<-これは不要ですarr.filter。代わりに実行してください。
Mahn 2014年

2
マーンは広くサポートされていません
Royi Namir 2014

回答:


135

どちらも同じように機能しますが、使用法が異なります。

フィルタ関数はhtml要素で使用することを目的としているため、jQueryオブジェクトを返すチェーン可能な関数であり、「:even」、「:odd」、「:visible」などのフィルタを受け入れます。これは、配列のユーティリティ関数として使用することを目的としたgrep関数を使用して行います。


1
.filter()がIEで機能しないことを強調したかったので、アプリがすべてのブラウザーをサポートする場合は$ .grep()を使用することをお勧めします。
vohrahul 2018

1
テストの結果、現在.filter()はIEとMicrosoftEdgeで機能することがわかりました。
Umesh K. 2018

19

フィルタはjQuery.fnの一部であるため$('div').filter、grepがjQueryツールメソッドであるセレクターで使用することを目的としています(jQuery.grep


確かに、フィルターの通常の使用法は、セレクター文字列を渡すことです。引数(index、item)はネイティブのフィルター関数(item、index)の反対ですが、フィルター関数を渡すこともできます。また、grepはネイティブの配列フィルター関数と非常に似ているようです。jqueryに対するgrepの利点は、古いブラウザーとの互換性にあると思います...
Bryan Matthews

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: Firefoxでは、フィルターはわずかに高速ですが、Chromeではその逆です。公演のみ、どなたでもご利用いただけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.