淘汰赛性能 - 过滤可观察到的数组(Knockout Performance - Filtering

2019-09-28 00:14发布

我是新来的淘汰赛,我试图用它显示一个系统的用户页面,每个用户都有角色上。

这些数据是在observableArray用户。 用户对象有一个角色的属性,这是另一种observableArray 。 这个第二阵列包含每个角色的一个对象,一个ID和“授予”属性是布尔值。

我希望能够有一个特定的角色来显示所有的用户,所以还有为每个角色复选框 - 当其中一个被选中,则列表应显示与该角色的用户。

我有问题是由角色过滤1000个左右的用户需要几秒钟。 过滤通过在名称的文本是非常快(几毫秒),而是通过作用过滤不。 我已经把一些计时代码,这个问题是我用来检查用户是否具有选定角色(S)的方法,所以我只是想知道是否有这样做,也许使用一些淘汰赛的更好的方法魔法。

下面是ko.computed上,我使用做过滤视图模型。 结果表绑定到这个功能。

self.filteredUsers = ko.computed(function () {

    var textFilter = self.filter();          // this is an observable bound to a text field
    var checkedRoles = self.selectedRoles(); // this is a computed, which returns an array of checked roles

    return ko.utils.arrayFilter(self.users(), function (user) {

        var match = true;

        if (user.displayName.toLowerCase().indexOf(textFilter.toLowerCase()) == -1) {
            match = false;
        }

        // for each ticked role, check the user has the role
        for (var i = 0; i < checkedRoles.length; i++) {
            var roleMatch = false;
            for (var j = 0; j < user.roles().length; j++) {
                if (user.roles()[j].roleId === checkedRoles[i].roleId && user.roles()[j].granted()) {
                    roleMatch = true;
                    break;
                }
            }
            if (!roleMatch) {
                match = false;
            }
        }

        return match;
    });
});

Answer 1:

我认为一个好的优化将要创建一个grantedRoles计算的用户对象上。 这种计算将返回一个对象,可以作为索引使用,将包含一个角色的唯一标识符键控特性,而且只包含被授予的角色。

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



文章来源: Knockout Performance - Filtering an Observable Array