将 key/value 数组中的对象与另一个对象 (Key/value) 进行比较

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

这是我目前遇到的问题。

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

所以我有一个 key/values 的数组,我在其中存储权限。

{"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 有一个整数值。为什么不是密钥的名称? (必须是 "role") 此外,当我在 roletest 变量上使用 Watch 时,它们完全相同但我仍然无法比较它们并得到 true.

(不要介意此时的 return 语句。) 我也不能修改数组。它是由 spring 安全性 return 以这种方式编辑的。

是否有任何(更好的)方法来检查 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函数。它仍然循环遍历数组,但会在遇到第一个为真的实例时停止。你的方法基本上已经在做同样的事情了,但是这样它更干净一些,因为它使用数组的实际元素(而不是索引)。

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