【问题标题】:How to check if any value in an array is present in another array in angular js?如何检查数组中的任何值是否存在于角度js的另一个数组中?
【发布时间】:2017-10-20 08:22:03
【问题描述】:

我正在用 Angular js 工厂方法编写一个权限函数来检查用户角色。如果用户对象具有这样的角色,那么结果应该为真,否则它应该返回假。 我的用户对象是:

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

应用模型工厂中的 My Permission 功能是:

$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. 如果该数组中有多个角色具有“必需全部”条件,则检查用户对象中是否存在多个角色,否则返回 true,否则返回 false。

 $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);

上面的代码对于单个角色检查运行良好,但在多个角色检查的情况下,“需要全部”或不是“全部需要”条件,它不能正常工作并返回 false。

【问题讨论】:

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


    【解决方案1】:

    我不相信你可以使用return 来摆脱AngularJS 的forEach,因为它可以替代forEach

    来自 MDN:

    除了抛出异常之外,没有其他方法可以停止或中断 forEach() 循环。

    在您的第一个 return true 之后,循环仍在继续,实际上并没有导致内部 return 语句被建立,而是从循环中掉入您的 return $requireAll;,在您的示例中,这就是您的 false 语句正在看。

    您可以通过在每个 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]);
    }
    

    下面的 sn-p 显示了这段代码在简单的 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));

    【讨论】:

    • 另外,如果角色不存在,您的最后一行 if (data.hasOwnProperty(role) && data[role]) 将失败。我通过返回条件检查解决了这个问题
    • 谢谢哥们!它工作得非常好。从前两天开始,我处理它就非常忙碌。你为我节省了很多时间。万分感谢。 @user2340824
    • 你好兄弟,@user2340824 你能看看我在下面给出的问题的链接吗?由于我没有任何其他方式与您联系,因此仅将此评论作为消息。 stackoverflow.com/questions/44538967/…
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多