将 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")
此外,当我在 role
和 test
变量上使用 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;
}
这是我目前遇到的问题。
我想检查一个用户是否有权限查看一个页面,只有一个功能。
所以我有一个 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")
此外,当我在 role
和 test
变量上使用 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;
}