使用lodash _find返回true或false

时间:2019-03-23 00:23:18

标签: angularjs find lodash

我正在尝试使用lodash函数来查找它是否满足if语句。当代码运行了“ return false”的代码后,它仍然继续执行_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 :(得分:0)

首先让我们停下来考虑一下_.find的实际作用。它遍历一个数组并返回匹配条件的数组的第一个元素。

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

如果您使用_.find函数,则将从$rootScope.CustomFields取回其中一个字段,或者如果没有一个字段从{返回真实值,则从undefined中取回其中一个字段{1}}。

这是您遇到问题的地方。匿名函数function(field)…仅返回false。如果发现错误,则需要返回true,否则返回false。

由于您的function(field)…函数最终尝试返回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;
}

前两个感叹号会将您的find函数的结果类型转换为… return !!!fieldWithErrors; (如果有问题)或true(如果它返回false),然后是第三次感叹号如果有错误,point会反转该布尔值以匹配您当前的返回undefined的方案。

(或者您可以将函数名称更改为false并返回errorsArePresenttrue)。