在Angular应用中,我应该使用哪一个并解释原因?
array.filter(o => o.name === myName);
或者
$filter('filter')(array, {name: myName}, true);
在Angular应用中,我应该使用哪一个并解释原因?
array.filter(o => o.name === myName);
$filter('filter')(array, {name: myName}, true);
$filter('filter')(array, 'keyword')
使用标准的ES5 Array.prototype.filter
不能如此简单。
虽然两种方法的一般思想相同 - 返回给定数组的子集作为新数组。
更新:
在幕后,Angular使用Array.prototype.filter
:
function filterFilter() {
// predicateFn is created here...
return Array.prototype.filter.call(array, predicateFn);
}
因此,如果您不使用快捷方式,angular 只是将调用委派给标准 filter
。
回答你的问题:使用让您编写更少代码的那个。在您的特定情况下,它将是 array.filter(o => o.name === myName);
如果未来可能升级到Angular 2或更高版本,则使用Array.filter将为您节省一些迁移问题。即使您没有计划升级,显然Angular团队认为AngularJS过滤器不值得保留,这让我认为最好还是避免使用它。 优先使用本地代码而不是库代码 像AngularJS这样的库和框架是令人惊异的工具;但是,如果必须选择使用原始JavaScript或使用库,并且没有使用库的好理由,您应该始终使用原始JavaScript。它更广泛地被理解,不那么依赖第三方代码等。有大量的在线文章支持这一点。 "$filter"抑制Typescript文件中的类型检查 这仅适用于使用(或计划使用)Typescript的情况。在撰写本文时,angularjs的@types库将所有$filter函数的返回类型定义为any,如果您不小心,可能会导致一些严重的类型检查问题。相比之下,Array.filter始终返回预期的数组类型。内置的AngularJS filter和orderBy filter在Angular中不存在,因此您需要自行进行过滤和排序。
Array.filter
并分配结果。当你使用 $filter
时,它会在每个绑定的$digest周期结束时重新应用到所有绑定上,这对于监视值并在每个$digest周期后更新结果来说是性能密集的。相反,你应该显式地过滤结果并将其分配给你的作用域变量。array.filter
会有一些样板代码,但性能更好。您需要在“性能”与“代码简洁性”之间进行权衡决策。 - Aditya Singh$filter
不会创建一个监视器。 - Dieterg$digest
循环之后它会被重新应用。 - Aditya Singh$stateful
标志,否则过滤器不会在每个$digest
周期后应用(仅适用于在HTML
模板中使用过滤器的情况)。如果您在控制器中使用$filter
(除非您处于$watch
中),则不会发生这种情况。但是,明确一点,我同意在这种情况下最好使用Array.filter
。 - Dieterg
true
作为comparator
参数传递,Angular将使用angular.equals
进行严格比较。 - Alexander Kravets