Grep vs jQuery中的过滤器?


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不存在)。
Felix Kling

2
$(arr).filter<-这是不必要的,arr.filter改为执行。
Mahn 2014年

2
马恩不支持广泛
Royi纳米尔

Answers:


135

它们的功能相似,但是用法不同。

过滤器函数旨在与html元素一起使用,这就是为什么它是一个可链接函数,它返回jQuery对象,并且接受诸如“:even”,“:odd”或“:visible”等过滤器。使用grep函数可以做到这一点,该函数旨在用作数组的实用程序函数。


1
只是想强调.filter()在IE中不起作用,因此最好使用$ .grep(),以防您的应用支持所有浏览器。
vohrahul

1
经过测试,发现当前.filter()在IE和Microsoft Edge中均可正常运行。
Umesh K.

19

过滤器是jQuery.fn的一部分,因此它的目的是与选择器一起使用,$('div').filter其中grep是jQuery工具方法(jQuery.grep


没错,filter的正常用法是传递选择器字符串。您也可以传递过滤器功能,尽管参数(索引,项目)与本机过滤器功能(项目,索引)相反。另外,grep似乎与本机数组过滤器功能非常相似。我怀疑grep对于jquery的优势是与旧版浏览器兼容...
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中则相反。仅限于表演,任何人都可以使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.