Как проверить, присутствует ли какое-либо значение в массиве в другом массиве в angular js?

Я пишу функцию разрешения в методе angular js factory, который проверяет роль пользователя. если пользовательский объект имеет такую ​​роль, тогда результат должен быть истинным, иначе он должен вернуть ложь. мой пользовательский объект:

administrator:true 
company_admin:true 
registered:true 
manager:true
contact:"987654321" email:"[email protected]" 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.


person Hemant    schedule 20.05.2017    source источник


Ответы (1)


Я не верю, что вы можете вырваться из forEach AngularJS, используя return, поскольку это альтернатива аналогу forEach.

Из МДН:

Невозможно остановить или разорвать цикл forEach(), кроме как выдать исключение.

После вашего первого return true цикл все еще продолжается, фактически не вызывая установки внутренних операторов return, выпадая из цикла в ваш return $requireAll;, который в ваших примерах является оператором false, который вы видите.

Вы можете увидеть это, разместив отладку перед каждым оператором возврата и увидев, что они продолжают срабатывать после return.

Используя some и каждый Я переписал вашу логику, чтобы избежать использования 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));

person user2340824    schedule 20.05.2017
comment
Кроме того, ваша последняя строка if (data.hasOwnProperty(role) && data[role]) завершится ошибкой, если роль не существует. Я решил это, вернув условную проверку - person user2340824; 20.05.2017
comment
Спасибо дружище!. Это сработало исключительно хорошо. Это было очень беспокойно для меня, чтобы иметь дело с этим в течение последних двух дней. Вы сэкономили мне много времени. Благодаря тонну. @user2340824 - person Hemant; 20.05.2017
comment
Привет, братан, @ user2340824, не могли бы вы взглянуть на ссылку на вопрос, который я даю ниже. Поскольку у меня нет другого способа связаться с вами, поэтому просто поместите этот комментарий как сообщение. stackoverflow.com/questions/44538967/ - person Hemant; 14.06.2017