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

时间:2015-03-05 14:08:19

标签: javascript arrays angularjs javascript-objects

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

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

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

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

(不要介意此时的退货声明。) 我也无法修改数组。它以这种方式由春季安全返回。

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

干杯。

3 个答案:

答案 0 :(得分:2)

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




答案 1 :(得分:1)

service.currentUser.authorities是一个数组,这就是为什么你在perm中得到for(perm in 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"] === role["role"])
            {
                return (!!(service.currentUser) && true);
            }
        }
        return false;
    }

希望这有帮助,

答案 2 :(得分:0)

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