我应该在角度应用程序中使用哪一个?为什么?
array.filter(o => o.name === myName);
或
$filter('filter')(array, {name: myName}, true);
答案 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样式的过滤器
内置的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 循环。相反,您应该过滤结果并明确地将其分配给范围变量