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

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

本文关键字:比较 一个对象 数组 对象 将键      更新时间:2023-09-26

所以这是我目前遇到的问题。

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

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

{"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参数的值为"gebruikersbeher"。

现在我想比较perm密钥和role的值,并检查它是否为真。现在我在互联网上搜索了一下,只找到了对我来说既不可行也不可行的解决方案。

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

(此时不要介意退货声明。)而且我不能修改数组。它是通过这种方式由弹簧安全返回的。

有没有更好的方法来检查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; 
}