JavaScript:仅当数组中的所有项都为true时才执行函数?

时间:2016-05-16 19:19:30

标签: javascript jquery arrays

我有这段代码:

// Required fields is an array of objects

required_fields.each(function() {

  // Check each field: If it has no value, do nothing.
  if( !$(this).val() ) {
    return false;
  }

  // If all the fields are there, do something.
  else {
    alert('Doing something.');
  }

});

我相信你能看到问题所在。在alert函数中使用.each()会导致警报触发数组中的每个项目。但我想要的是仅在所有数组项都有值的情况下触发事件 - 即如果没有return false

只有在所有数组项都通过后触发某事的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

为每个值实施一个小计数器。

var valueCount = 0;

required_fields.each(function () {
  if (!$(this).val()) {
    return false;
  } else {
    valueCount++; // increment to say has value
  }

});

if (valueCount == required_feilds.length) {
  alert('Doing something.');
}

答案 1 :(得分:1)

您可以使用Array.prototype.every,当返回假值时会短路:

var isTrue = [].every.call(required_fields, function(el) {
  return $(el).val();
});

if (isTrue) {
  console.log('Doing something');
}

我不认为你有一个数组而是一个jQuery对象就是数组(得到长度和01,......属性)所以你可以(ab)使用本机通过使用.call

设置上下文的数组原型
var every = Array.prototype.every;
every.call({ '0': 'a', '1': 'b', length: 2 }, console.log.bind(console));
// will output
// ['a', 0]
// ['b', 1]

现在我想起来jQuery.fn.each如果返回false也会短路。

答案 2 :(得分:1)

两个主要选择突出: 1:编写一个带有jQuery对象数组的简单函数,如果数组中的所有项都有值

,则返回true
var allHaveValue = function(array){
    for(var i = 0; i < array.length; i++){
        if(!$(array[i]).val()){
            return false;
        }
    }
    return true;
};

// For your example
if(allHaveValue(required_fields)){
    // Proceed
} else{
    // Handle errors   
}

另一种选择是做同样的事情,但为[every] [1]使用underscore.js函数

[1]:http://underscorejs.org/#every做同样的事情。这个电话看起来像是:

var allHaveValue = _.every(required_fields, function(item){
    return $(item).val();
});

if(allHaveValue)}{
    // Proceed
} else{
    // Handle errors
}