如何检查数组中的任何值是否存在于角度js中的另一个数组中?

时间:2017-05-20 07:11:35

标签: angularjs arrays angular-ui-router role-based-access-control

我正在角度js工厂方法中编写一个权限函数来检查用户角色。如果用户对象具有此角色,则结果应为true,否则应返回false。 我的用户对象是:

administrator:true 
company_admin:true 
registered:true 
manager:true
contact:"987654321" email:"abcd@gmail.com" name:"Anand"

应用模型工厂中的我的权限功能是:

$appModel.checkPermission:function($role, $requireAll) {
            var data = $rootScope.authUser;
            if (angular.isArray($role)) {
                angular.forEach($role, function (value, key) {
                    var hasRole =  $appModel.checkPermission(value); //Recursive Function
                    if (hasRole && !$requireAll) {
                        return true;
                    } else if (!hasRole && $requireAll) {
                        return false;
                    }
                });
                return $requireAll;
            } else {
                if (data.hasOwnProperty($role) && data[$role])
                    return true;
            }
            return false;
        }

我正在检查以下案例: 1。如果该数组中有多个角色,其中包含'required all'条件,则检查用户对象中是否存在多个角色,否则返回true。

 $result= $appModel.checkPermission([registered, company_admin], true);

2. 如果该数组中有多个角色,则检查用户对象中是否存在多个角色,如果任何角色匹配,则返回true,否则返回false。

 $result= $appModel.checkPermission([administrator, company_admin,manager,agent], false);

3. 如果该数组中有单个角色,则检查该角色是否存在于用户对象中,如果该角色匹配,则返回true,否则返回false。

  $result= $appModel.checkPermission(register, false);

上面的代码对于单个角色检查运行正常,但是如果使用“required all”或“required all”条件进行多个角色检查,它将无法正常工作并返回false。

1 个答案:

答案 0 :(得分:0)

我不相信你可以使用return打破AngularJS的forEach,因为它可以替代forEach

来自MDN:

  

除了抛出异常之外,没有办法停止或破坏forEach()循环。

在你的第一个return true循环仍然存在之后,实际上并没有导致内部return语句被建立,从循环中掉进你的return $requireAll;中,在你的例子中,false是{你看到的{1}}声明。

您可以通过在每个return语句之前放置调试,并在return之后看到它们继续触发来看到这一点。

使用someevery我重写了您的逻辑以避免使用forEach

var results = $role.map($appModel.checkPermission);
return requireAll
  ? results.every(function(item) {return item;})
  : results.some(function(item) {return item;})
} else {
  return (data.hasOwnProperty(role) && data[role]);
}

以下代码段显示此代码仅使用JavaScript。

var roleChecker = function(role, requireAll) {
  var data = {
    administrator: true,
    company_admin: true,
    registered: true,
    manager: true,
  };
  
  if( Object.prototype.toString.call(role) === '[object Array]' ) {
    var results = role.map(roleChecker);
    
    return requireAll ? results.every(function(item) {return item;})
      : results.some(function(item) {return item;})
  } else {
    return (data.hasOwnProperty(role) && data[role]);
  }
  
};

console.log(roleChecker(['administrator', 'manager'], false));
console.log(roleChecker(['administrator', 'company_admin', 'fake_role'], true));
console.log(roleChecker(['administrator', 'company_admin'], true));
console.log(roleChecker('administrator', false));
console.log(roleChecker('fake_role', false));