используя lodash _find для возврата true или false - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь использовать функцию lodash, чтобы найти, удовлетворяет ли она условию if.Когда код запустил код, который «возвращает ложь», он все еще продолжает выполнять функцию _find и не возвращает результат (логическое значение) в scope.onToggle.

 $scope.onToggle = function(disposition) {
      if (requiredFieldsEntered()===false){
         // if return value from the function is false, alert user
       } 
  }

 function requiredFieldsEntered(){
    var res = _.find($rootScope.CustomFields, 
      function(field){

       if(field.enabled && field.required){
         if(field.table_name === 'session'){
           if(!$scope.session.external_id){
               console.log(field.column_name);
               return false;
           }
           else if (field.table_name === "session_extension"){
              if(!$scope.session.extension|| ($scope.session.extension && !$scope.session.extension[field.column_name])){
                 console.log(field.column_name);
                 return false;
           }
        }
      } 
    }});

    if (res) return false;
    else return true;
  }

1 Ответ

0 голосов
/ 23 марта 2019

Сначала давайте остановимся и посмотрим, что на самом деле делает _.find. Он зацикливается на массиве и возвращает первый элемент массива, соответствующий условию.

_.find([1, 2, 3, 4], function(num) { return num % 2 === 0 });
// returns 2

В случае вашей функции _.find вы получите либо одно из полей из $rootScope.CustomFields, либо undefined, если ни одно из полей не вернет истинное значение из function(field)….

Здесь у вас есть проблема. Анонимная функция function(field)… только когда-либо возвращает false. Вам необходимо возвратить true, если вы обнаружите ошибку, или иначе вернуть false.

Поскольку ваша функция requiredFieldsEntered() в конечном итоге пытается вернуть либо true, либо false, вы можете решить, какой из них вернуть, основываясь на том, возвращает ли ваша функция _.find какой-либо объект или undefined.

Примерно так:

$scope.onToggle = function(disposition) {
  if (requiredFieldsEntered()===false){
    // if return value from the function is false, alert user
  }
}

function requiredFieldsEntered(){
  const fieldWithErrors = _.find($rootScope.CustomFields,
    function(field){
      let result = true;
      if(field.enabled && field.required){
        if(field.table_name === 'session'){
          if(!$scope.session.external_id){
            console.log(field.column_name);
            result = false;
          } else if (field.table_name === "session_extension"){
            if(!$scope.session.extension|| ($scope.session.extension && !$scope.session.extension[field.column_name])){
              console.log(field.column_name);
              result = false;
            }
          }
        }
      }
      return result;
    });

  if (fieldWithErrors) {
    return false;
  }
  return true;
}

Быстрое замечание, что более короткая, но несколько менее читаемая версия в конце может заменить этот бит:

…
  if (fieldWithErrors) {
    return false;
  }
  return true;
}

С:

…
return !!!fieldWithErrors;

Первые два восклицательных знака будут приводить к типу результата вашей функции поиска либо к true, если он что-то придумывает, либо к false, если он возвращает undefined, а затем третий восклицательный знак инвертирует это логическое значение в соответствует вашей текущей схеме возврата false, если есть ошибки.

(Или вы можете изменить имя вашей функции на errorsArePresent и вернуть true - !!fieldWithErrors).

...