Me preguntaba acerca de las diferencias entre Grep y Filter:
Filtro:
Reduzca el conjunto de elementos coincidentes a aquellos que coincidan con el selector o pasen la prueba de la función.
Grep:
Encuentra los elementos de una matriz que satisfacen una función de filtro. La matriz original no se ve afectada.
Okay.
así que si hago esto en 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);
});
También podría hacer:
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);
});
En ambas situaciones todavía puedo acceder a la matriz original ...
entonces ... ¿dónde está la diferencia?
.grep()
es un método auxiliar para el procesamiento general de matrices, mientras.filter()
que generalmente se usa para reducir las selecciones de elementos. No creo que.grep()
devuelva un objeto jQuery y no puede encadenarlo (jQuery.fn.grep
no existe).$(arr).filter
<- esto es innecesario, hágalo en suarr.filter
lugar.Respuestas:
Ambos funcionan de manera similar, sin embargo, difieren en sus usos.
La función de filtro está destinada a ser utilizada con elementos html, y por eso es una función encadenable que devuelve un objeto jQuery y acepta filtros como ": par", ": impar" o ": visible", etc. Haga eso con la función grep, que pretende ser una función de utilidad para matrices.
fuente
El filtro es parte de jQuery.fn, por lo que su objetivo es usarlo con el selector,
$('div').filter
donde grep es un método de herramienta jQuery (jQuery.grep
)fuente
La diferencia en su uso:
Filtrar:
Grep:
Así, en su caso prefiero usar
grep()
porque el uso conjunto de esta manera no es necesario:$(arr)
.También supongo que esa
grep
función es más rápida, porque solo acepta matrices.fuente
Para aquellos que estén interesados en cómo
grep
funciona contrafilter
, escribí esta prueba:TLDR; Grep es muchas veces más rápido.
Script que utilicé para probar:
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>
fuente
@Matas Vaitkevicius, el fragmento de código publicado presenta errores, aquí hay uno corregido:
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: en Firefox , el filtro es un poco más rápido, en Chrome, eso es todo lo contrario. Solo con respecto a las actuaciones, puede utilizar a cualquiera.
fuente