Performance 淘汰性能-过滤可观察阵列

Performance 淘汰性能-过滤可观察阵列,performance,knockout.js,Performance,Knockout.js,我是一个新手,我尝试在显示系统用户和每个用户角色的页面上使用它 数据位于用户的可观察页面中。用户对象有一个roles属性,它是另一个observableArray。第二个数组包含每个角色的一个对象,具有一个ID和一个布尔“grated”属性 我希望能够显示具有特定角色的所有用户,因此每个角色都有一个复选框-选中其中一个时,列表应显示具有该角色的用户 我遇到的问题是,按角色筛选1000个左右的用户需要几秒钟的时间。按名称中的文本进行筛选非常快(几毫秒),但按角色进行筛选则不然。我已经加入了一些计时

我是一个新手,我尝试在显示系统用户和每个用户角色的页面上使用它

数据位于用户的
可观察页面中。用户对象有一个roles属性,它是另一个
observableArray
。第二个数组包含每个角色的一个对象,具有一个ID和一个布尔“grated”属性

我希望能够显示具有特定角色的所有用户,因此每个角色都有一个复选框-选中其中一个时,列表应显示具有该角色的用户

我遇到的问题是,按角色筛选1000个左右的用户需要几秒钟的时间。按名称中的文本进行筛选非常快(几毫秒),但按角色进行筛选则不然。我已经加入了一些计时代码,问题是我用什么方法来检查用户是否拥有所选的角色,所以我只是想知道是否有更好的方法,也许是使用一些击倒魔法

下面是我用来进行过滤的视图模型上的ko.computed。结果表绑定到此函数

self.filteredUsers=ko.computed(函数(){
var textFilter=self.filter();//这是绑定到文本字段的可观察对象
var checkedRoles=self.selectedRoles();//这是一个计算的角色,它返回一个已检查角色的数组
返回ko.utils.arrayFilter(self.users(),函数(user){
var匹配=真;
if(user.displayName.toLowerCase().indexOf(textFilter.toLowerCase())==-1){
匹配=假;
}
//对于每个勾选的角色,检查用户是否具有该角色
对于(var i=0;i
我认为一个好的优化方法是在用户对象上创建一个
grantedRoles
。这将返回一个可以用作索引的对象,将包含由角色的唯一标识符键控的属性,并且只包含已授予的角色


然后在
filteredUsers
中,您将针对每个选中的角色检查
grantedRoles
对象,而不是针对每个选中的角色循环通过
user.roles()

谢谢Ryan-这当然有帮助。之前需要3500毫秒到4000毫秒。被授予的角色将其压缩到略高于200毫秒。