Array.filter vs $ filter('filter')

时间:2016-06-24 07:23:09

标签: javascript arrays angularjs filter

我应该在角度应用程序中使用哪一个?为什么?

array.filter(o => o.name === myName);

$filter('filter')(array, {name: myName}, true);

3 个答案:

答案 0 :(得分:4)

关键区别在于$filter('filter')提供的快捷方式或语法糖。例如,以下语法可用于在任何项目keyword属性中获取包含string字符串的项目:

$filter('filter')(array, 'keyword')

使用标准ES5 Array.prototype.filter不能那么简单。

尽管两种方法的总体思路相同 - 将给定数组的子集作为 NEW 数组返回。

<强>更新

Under the hood angular使用Array.prototype.filter

function filterFilter() {
    // predicateFn is created here...

    return Array.prototype.filter.call(array, predicateFn);
}

因此,如果您不使用快捷方式,则只需将调用委托给标准filter

回答您的问题:使用可以减少代码编写的问题。在您的特定情况下,它将是array.filter(o => o.name === myName);

答案 1 :(得分:2)

虽然使用$ filter('filter')可能更容易,并且在语法上更具吸引力,但我可以想到四个在$ filter('filter')上使用Array.filter的好理由。

效率

$ filter('filter')确实在后台使用Array.filter时,除了Array.filter之外,它还使用其他代码,包括深度比较。在大多数情况下,速度差异可以忽略不计,但在某些用例中,速度差异可能很大。例如,在处理大型数据对象时,我发现使用Array.filter会有所不同。

Angular 2+不支持AngularJS样式的过滤器

来自angular migration guide

内置的AngularJS过滤器和orderBy过滤器在 有角度的,因此您需要自己进行过滤和排序。

如果将来有可能升级到Angular 2或更高版本,则使用Array.filter将为您节省一些迁移偏头痛。即使您不打算升级,显然Angular团队也不认为AngularJS过滤器值得保留,这使我认为最好还是避免使用它。

通过库代码获得的本机代码

像AngularJS这样的库和框架都是很棒的工具。但是,如果您必须选择使用原始JavaScript还是使用库,并且没有充分的理由使用该库,则应始终使用原始javascript。它得到了更广泛的理解,较少依赖于第三方代码等。这一点上有很多在线文章。

“ $ filter”禁止在Typescript文件中进行类型检查

仅当您使用(或计划使用)打字稿时才适用。在撰写本文时,angularjs的@types库将所有$ filter函数的返回类型定义为 any ,如果您不小心,可能会导致一些严重的类型检查问题。相比之下,Array.filter总是返回预期的数组类型。

答案 2 :(得分:-1)

您应该使用Array.filter然后分配结果。当您使用$filter时,会在所有绑定的每个 $ digest 周期结束时重新应用它,并且这是性能密集型的,以观察值并在每次<更新后更新结果强> $ digest 循环。相反,您应该过滤结果并明确地将其分配给范围变量