25

我需要一个 jQuery filter/map/each 类型函数来检查所有元素是否满足条件:

function areAllValid(inputs){
     return $.someFunction(inputs, function(input) { return input.length > 0; }); 
}

如果所有输入的长度 > 0someFunction应该返回 true。jQuery中有这样的东西吗?

4

8 回答 8

11

答案是肯定的,它有一个方法 grep 可以满足你的要求。例如:

inputs= jQuery.grep(inputs, function(input){
return input.length>0;
});
if(inputs.length>0) return true;
return false;

我没有测试它,也许它有一个小问题,但应该几乎是这样的。

于 2013-03-18T06:20:56.000 回答
11

您不需要使用 jQuery 来执行此操作。您可以使用Array.prototype.every在本机 JavaScript 中执行此操作,IE 9+ 支持它。

function areAllValid(inputs){
     return inputs.every(function(input) { return input.length > 0; }); 
}

如果您使用的是 EcmaScript 2015,您可以进一步整理:

var areAllValid = inputs => inputs.every(input => input.length > 0);
于 2016-02-17T14:57:25.943 回答
4

这将遍历每个项目,以及与先前结果的条件,因此只有当所有项目的条件都为真时,它才会返回真。您当然可以用回调函数替换条件,并做inputs.each(而不是,$('input')但您可能需要根据输入是否为 jquery 对象稍微调整代码。

var all = true;
  $('input').each( function(index, value) { 
    all = all & ($(value).val().length > 0);
  });
return all;
于 2013-03-18T06:35:49.103 回答
0

不完全是,但很容易创建一个:

    $.eachCondition = function (obj, conditionFunction){
        var trueCount=0;
        var falseCount=0;

        $.each(obj, function (i,v) {
          if (conditionFunction.call(this,i,v)) {
            trueCount++;
          }
          else {
            falseCount++;
          }
          });
          if (falseCount===0) {
            return true;
          }
          if (trueCount===0) {
            return false;
          }
          return undefined;
      };
      $.fn.eachCondition = function (conditionFunction) {
        return $.eachCondition(this, conditionFunction);
      };

这是工作测试:http: //jsbin.com/iwanof/2/

于 2013-03-18T07:25:46.830 回答
0

我通常使用以下表格在 JQuery 中获取匹配项

$.map($("[some selector]"), function(e) {
  return ([some matching mechanism]);
}).indexOf(false) == -1;

在您的特定情况下,它看起来像这样:

$.map(inputs, function(e) {
  return (e.length > 0);
}).indexOf(false) == -1;

希望这可以节省您一些时间。

于 2016-02-17T14:46:05.567 回答
0

现有答案没有解决一些小的优化问题,所以我会用我认为是最具可读性/性能的代码来表达我的看法。

添加一个这样的jQuery扩展方法,它会短路:

/** 
* Determines whether all elements of a sequence satisfy a condition.
* @@param  {function} predicate - A function to test each element for a condition.
* @@return {boolean}  true if every element of the source sequence passes the test in the specified predicate
*/
$.fn.all = function (predicate) {
    $(this).each(function (i, el) {
        if (!predicate.call(this, i, el)) return false;
    });
    // we made it this far, we're good.
    return true;
};

然后像这样调用它:

var allValid = $("form :input").all(function () {
                   return $(this).valid();
                });
于 2016-11-02T12:19:29.047 回答
0

快速的小 jQuery:

$(document).ready(function() {
  $('form input').keyUp(function() {
    var allValid = true;
    $.each($('form input'), function(input) { 
      allValid = input.val().length > 0 
    }
    if ( allValid )
      ...
    else
      ...
  })
});
于 2017-02-10T10:11:20.700 回答
0
function areAllValid(inputs){
     return Array.prototype.every.call(inputs, function(input) { return input.length > 0; }); 
}
于 2018-01-23T21:26:12.283 回答