AngularJS改进了嵌套数组的过滤
AngularJS improve filtering for nested arrays
首先,我有某种可行的解决方案,但我只是问我是否可以调整它以获得更好的性能。所以,我的嵌套数组结构看起来像这样:
$scope.clients = [
{
name: "Ivan Drew",
age: 21,
company: "HP",
apps: [
{
appName: "Facebook",
used: "Y",
installedDate: "21/12/2014"
},
{
appName: "Instagram",
used: "N",
installedDate: "14/12/2014"
}
]
},
{
name: "John Roberts",
age: 35,
apps: [
{
appName: "Messenger",
used: "Y",
installedDate: "01/01/2015"
},
{
appName: "Facebook",
used: "Y",
installedDate: "09/11/2014"
},
{
appName: "Instagram",
used: "Y",
installedDate: "20/10/2014"
}
]
},
{
name: "Richard James",
age: 28,
apps: [
{
appName: "Instagram",
used: "N",
installedDate: "15/11/2014"
}
]
}
];
现在,我想过滤此列表以显示已安装例如 Facebook 应用程序并一直在使用它的客户(used
属性显示了这一点)。所以我想像这样显示列表:
Ivan Drew
Facebook
21/12/2014
John Roberts
Facebook
09/11/2014
我用两个ng-repeat
创建了我的 html,如下所示:
<div class="client-info" ng-repeat="client in clients">
<div ng-repeat="app in client.apps | filter: { name: 'Facebook', used: 'Y' }">
{{ client.name }}<br />
{{ app.appName }}<br />
{{ app.installedDate }}<br />
</div>
</div>
因此,正如我上面所说,这按预期工作,但是当您有很多信息(例如,1000 个客户端,每个客户端至少有 5 个应用程序)时,我检查了它,它会变得滞后很多。所以我检查了这个的输出是什么,看到显示了.client-info
元素(当然是空的),即使没有一个应用程序符合要求。我正在考虑如何优化它,但现在还不够。
有人有一些想法如何让它变得更好吗?
提前感谢! :)
您可以通过多种方式来提高性能。
使用 ::
语法仅绑定一次(假设您不需要 2 路绑定)。
<div ng-repeat="app in ::client.apps | filter: { name: 'Facebook', used: 'Y' }">
{{ ::client.name }}<br />
{{ ::app.appName }}<br />
{{ ::app.installedDate }}<br />
</div>
如果您使用的是 Angular <1.3,则需要具有不同语法的第三方绑定一次库。
如果确实只是按硬编码筛选器进行筛选(如示例中所示),则可以在数据到达视图之前对其进行筛选(在控制器中,或者更好的是,在检索数据的服务中)。 这将防止 Angular 在每个摘要循环中重新评估您的过滤器。
还可以使用 track by
语法来提高性能。 在这种情况下,我按 client.name 猜测(但这只是一个猜测):
ng-repeat="app in ::client.apps | filter: { name: 'Facebook', used: 'Y' } track by client.name
如果客户端名称不唯一,则可能需要对其进行调整。
我怀疑只实现一次绑定会给你带来显著的性能提升。
在控制器中,您可以过滤然后发送它以供查看,而不是发送整个对象。像这样的东西;
function filter(element, appName) {
var retArr = [];
if(element.length > 0) {
for(i = 0 ; i < element.length ; i++){
var arrAppend = element[i];
if(arrAppend.apps.length > 1) {
for(j = 0 ; j < arrAppend.apps.length ; j++) {
if(arrAppend.apps[j]['appName'] == appName && arrAppend.apps[j]['used'] == 'Y') {
retArr.push(arrAppend);
break;
}
}
}
}
}
return retArr;
}
$scope.clients = filter($scope.clients, 'Facebook'));
或者如果你有jquery,你可以使用$.grep
- 使用一个键的值数组过滤多个javascript对象
- 根据另一个包含角度 js 中对象的数组过滤包含对象的数组
- Javascript:按字符串数组过滤对象数组
- 在 javascript 中使用数组过滤 for AngularJS
- 挖空和选择器的数组过滤问题
- Lodash 按数组的属性数组过滤
- 如何用另一个字符串数组过滤ng重复中的字符串数组
- 如何根据javascript数组过滤rss数据
- 基于NodeJS中的其他数组过滤/搜索对象的JavaScript数组
- 使用不带嵌套循环的数组过滤对象数组js
- 使用数组过滤数组Javascript
- 用一维数组过滤多维数组
- AngularJS:如何给值数组过滤
- Angularjs,逐个数组过滤
- 用另一个对象数组过滤Javascript对象数组
- 创建搜索栏以将数组过滤到表中
- 通过id数组过滤角度数据
- coffeescript -数组过滤不工作
- Backbone.js:如何通过模型ID数组过滤对象集合
- 使用基于嵌套值的数组过滤对象数组