【问题标题】:Comparing objects from key/value array with another object (Key/value)将键/值数组中的对象与另一个对象(键/值)进行比较
【发布时间】:2015-03-05 14:08:18
【问题描述】:

这就是我目前遇到的问题。

我想检查一个用户是否有权限查看一个页面,只有一个功能。

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

{"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

(此时不要介意返回语句。) 我也无法修改数组。 spring security 就是这样返回的。

有没有(更好的)方法来检查authorities 是否包含role? 它可能是重复的,但我找不到适合我具体情况的任何东西。

干杯。

【问题讨论】:

    标签: javascript arrays angularjs javascript-objects


    【解决方案1】:

    您目前正在检查一个对象和另一个对象,最好用字符串检查字符串,下面显示一个相同功能的小示例,但使用数组中的 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"))

    【讨论】:

    • 像魅力一样工作。我们没有想出“一些”的方法。这是最短的一段代码,所以我将其标记为答案。非常感谢!
    【解决方案2】:

    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;
        }
    

    希望这会有所帮助,

    【讨论】:

    • 这也有效。我将另一个答案标记为解决方案,因为它更短。但这确实帮助我理解了数组和键值。谢谢!
    • @Clemenz 没问题:),很高兴为您提供帮助。
    【解决方案3】:

    由于您只关心某物是否存在,您可以使用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; 
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多