Grep, jQuery'de filtre mi?


84

Grep ve Filter arasındaki farkları merak ediyordum:

Filtrele:

Seçici ile eşleşen veya işlevin testini geçen eşleşen öğeler kümesini azaltın.

Grep:

Bir dizinin filtre işlevini sağlayan öğelerini bulur. Orijinal dizi etkilenmez.

tamam.

yani bunu GREP'de yaparsam:

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

Ben de yapabilirim:

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

Her iki durumda da orijinal diziye hala erişebiliyorum ...

yani ... fark nerede?


4
.grep()Genel dizi işleme için yardımcı bir yöntem olduğunu düşünüyorum , ancak .filter()genellikle öğe seçimlerini daraltmak için kullanılır. .grep()Bir jQuery nesnesi döndürdüğünü sanmıyorum ve onu zincirleyemezsiniz ( jQuery.fn.grepmevcut değil).
Felix Kling

2
$(arr).filter<- bu gereksizdir, arr.filterbunun yerine yapın.
Mahn

2
Mahn yaygın olarak desteklenmiyor
Royi Namir

Yanıtlar:


135

Her ikisi de benzer şekillerde işlev görür ancak kullanımları farklıdır.

Filtre işlevinin html öğeleriyle kullanılması amaçlanmıştır ve bu nedenle, bir jQuery nesnesi döndüren zincirlenebilir bir işlevdir ve ": çift", ": tek" veya ": görünür" gibi filtreleri kabul eder. Yapabilirsiniz ' bunu diziler için bir yardımcı program işlevi olması amaçlanan grep işlevi ile yapın.


1
.Filter () işlevinin IE'de çalışmadığını vurgulamak istedim, bu nedenle uygulamanızın tüm tarayıcıları desteklemesi durumunda $ .grep () kullanmanız daha iyi olur.
vohrahul

1
test edildi ve şu anda .filter () 'in IE ve Microsoft Edge'de çalıştığı bulundu.
Umesh K.

19

Filtre, jQuery.fn'nin bir parçasıdır, bu nedenle amacı grep'in $('div').filterbir jQuery aracı yöntemi olduğu seçici ile birlikte kullanılmaktır ( jQuery.grep)


Doğru, filtrenin normal kullanımı bir seçici dizi geçirmektir. Bağımsız değişkenler (dizin, öğe) yerel filtre işlevinin (öğe, dizin) tersi olmasına rağmen, bir filtre işlevi de iletebilirsiniz. Ayrıca grep, yerel dizi filtre işlevine çok benzer görünüyor. Jquery için grep'in avantajının eski tarayıcılarla uyumluluk olduğundan şüpheleniyorum ...
Bryan Matthews

6

Kullanımındaki fark:

Filtrele:

$(selector).filter(selector/function)

Grep:

$.grep(array,function,invert)

Senin durumunda ben daha çok kullanırsınız Yani grep()dizisi kullanarak çünkü bu şekilde gereksizdir: $(arr).

Ayrıca grepişlevin daha hızlı olduğunu düşünüyorum , çünkü sadece dizileri kabul ediyor.


1

Nasıl ilgilenen olanlar için grepkarşı gerçekleştirdiği filterI Bu testi yazdı:

TLDR; Grep birçok kez daha hızlıdır.

Test için kullandığım komut dosyası:

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, yayınlanan kod pasajı hatalar sunuyor, işte düzeltilmiş bir tane:

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'ta, filtre kromda biraz daha hızlıdır, tam tersi. Yalnızca performanslarla ilgili olarak, herhangi birini kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.