繁体   English   中英

将键/值数组中的对象与另一个对象(键/值)进行比较

[英]Comparing objects from key/value array with another object (Key/value)

所以这是我目前遇到麻烦的情况。

我想通过一个功能检查用户是否有权查看页面。

所以我有一个带有键/值的数组,我在其中存储权限。

{"authorities":[{"role":"gebruikersbeheer"},{"role":"kijken"},{"role":"plannen"}]};

存储在service.currentUser ,可以使用service.currentUser.authorities进行调用。

我有一个功能:

hasPermission: function (permission) {
            var role = { "role" : permission };
            for(perm in service.currentUser.authorities)
            {
                var test = service.currentUser.authorities[perm];
                if(test === role)
                {
                    return (!!(service.currentUser) && true);
                }
            }
            return false;
        }

我创建了test变量以调试其值。 permission参数的值为'gebruikersbeheer'。

现在,我想将perm键的值与role进行比较,并检查它是否为真。 现在,我已经在互联网上进行搜索,而我发现的解决方案对我来说既不可行,也不可行。

当我开始调试时,我的perm有一个整数值。 为什么不是密钥名称? (必须是“角色”)此外,当我在roletest变量上使用Watch时,它们是完全相同的,但仍然无法比较它们并得出true

(此时不要在意return语句。)我也无法修改数组。 这样,Spring Security会将其返回。

有什么(更简单的方法)检查authorities包含role 它可能是重复的,但我找不到适合自己特定情况的任何东西。

干杯。

您当前正在用另一个对象检查一个对象,最好是用该字符串检查该字符串,下面显示了相同功能的一个小例子,但使用了数组中的some方法;

 var currentUser = {"authorities":[{"role":"gebruikersbeheer"},{"role":"kijken"},{"role":"plannen"}]}; function hasPermission(permission) { return currentUser.authorities.some(function(v){ return v.role === permission; }); } alert("Have permission? "+ hasPermission("gebruikersbeheer")) 

service.currentUser.authorities是一个数组,这就是为什么要在for(perm in service.currentUser.authorities)获得perm的整数的原因。

另一个问题是您不能使用===来比较对象中的所有属性(包括原型属性),因此您需要显式比较属性的值...或创建自定义函数来比较对象。

您可以尝试:

     hasPermission: function (permission) {
        var role = { "role" : permission };
        for(perm in service.currentUser.authorities)
        {
            var test = service.currentUser.authorities[perm];
            if(test["role"] === role["role"])
            {
                return (!!(service.currentUser) && true);
            }
        }
        return false;
    }

希望这可以帮助,

由于您只关心是否存在某些内容,因此可以使用Array.Some函数。 它仍然循环遍历数组,但是在遇到第一个为true的实例时将停止。 您的方法基本上已经在做同样的事情,但是用这种方法更干净一点,因为它使用了数组的实际元素(而不是索引)。

hasPermission: function (permission) {
    var authArray = service.currentUser.authorities;

    var hasAuth = authArray.some(function(kvp) {
        return kvp.role == permission; //function to determine a match
    });
    return hasAuth; 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM