grep vs jQuery过滤?
我想知道Grep和Filter之间的区别:
filter:
将匹配元素的集合减less为匹配select器或通过函数testing的元素。
Grep:
查找满足filterfunction的数组元素。 原始数组不受影响。
好。
所以如果我在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); });
在这两种情况下,我仍然可以访问原始数组…
所以…区别在哪里?
它们都以类似的方式运行,但是它们的用途是不同的。
过滤函数是为了与html元素一起使用,这就是为什么它是一个可链接的函数,它返回一个jQuery对象,它接受像“:even”,“:odd”或“:visible”等filter。用grep函数来实现这个function,这个function是为了实现数组的实用function。
filter是jQuery.fn的一部分,所以它的目标是用于select器$('div').filter
其中grep是一个jQuery工具方法( jQuery.grep
)
用法上的差异:
过滤:
$(selector).filter(selector/function)
grep的:
$.grep(array,function,invert)
所以在你的情况下,我宁愿使用grep()
因为使用数组这种方式是不必要的: $(arr)
。
我也假设grep
函数更快,因为它只接受数组。
对于那些对grep
如何执行filter
感兴趣的人,我写了这个testing:
TLDR; Grep快了好几倍。
我用于testing的脚本:
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>
@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>