86

我想知道 Grep 和 Filter 之间的区别:

筛选 :

将匹配元素集减少为匹配选择器或通过函数测试的元素。

格雷普:

查找满足过滤器函数的数组元素。原始数组不受影响。

好的。

所以如果我在 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

5 回答 5

138

它们都以相似的方式起作用,但是它们的用法不同。

filter 函数旨在与 html 元素一起使用,这就是为什么它是一个可链接的函数,它返回一个 jQuery 对象并接受像 ":even"、":odd" 或 ":visible" 等过滤器。你可以t 使用 grep 函数来做到这一点,该函数旨在成为数组的实用函数。

于 2012-04-13T11:51:21.453 回答
20

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

于 2012-04-13T11:37:53.193 回答
6

其用法上的区别:

筛选:

$(selector).filter(selector/function)

格雷普:

$.grep(array,function,invert)

所以在你的情况下,我宁愿使用grep(),因为以这种方式使用数组是不必要的:$(arr)

我还认为该grep函数更快,因为它只接受数组。

于 2014-07-02T11:00:23.780 回答
1

对于那些grepfilter我写这个测试的表现感兴趣的人:

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>

于 2016-10-10T08:13:42.183 回答
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 中,情况正好相反。仅关于表演,您可以使用任何人。

于 2017-02-23T10:03:39.737 回答