我需要一个 jQuery filter/map/each 类型函数来检查所有元素是否满足条件:
function areAllValid(inputs){
return $.someFunction(inputs, function(input) { return input.length > 0; });
}
如果所有输入的长度 > 0someFunction
应该返回 true。jQuery中有这样的东西吗?
我需要一个 jQuery filter/map/each 类型函数来检查所有元素是否满足条件:
function areAllValid(inputs){
return $.someFunction(inputs, function(input) { return input.length > 0; });
}
如果所有输入的长度 > 0someFunction
应该返回 true。jQuery中有这样的东西吗?
答案是肯定的,它有一个方法 grep 可以满足你的要求。例如:
inputs= jQuery.grep(inputs, function(input){
return input.length>0;
});
if(inputs.length>0) return true;
return false;
我没有测试它,也许它有一个小问题,但应该几乎是这样的。
您不需要使用 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);
这将遍历每个项目,以及与先前结果的条件,因此只有当所有项目的条件都为真时,它才会返回真。您当然可以用回调函数替换条件,并做inputs.each(
而不是,$('input')
但您可能需要根据输入是否为 jquery 对象稍微调整代码。
var all = true;
$('input').each( function(index, value) {
all = all & ($(value).val().length > 0);
});
return all;
不完全是,但很容易创建一个:
$.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/
我通常使用以下表格在 JQuery 中获取匹配项
$.map($("[some selector]"), function(e) {
return ([some matching mechanism]);
}).indexOf(false) == -1;
在您的特定情况下,它看起来像这样:
$.map(inputs, function(e) {
return (e.length > 0);
}).indexOf(false) == -1;
希望这可以节省您一些时间。
现有答案没有解决一些小的优化问题,所以我会用我认为是最具可读性/性能的代码来表达我的看法。
添加一个这样的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();
});
快速的小 jQuery:
$(document).ready(function() {
$('form input').keyUp(function() {
var allValid = true;
$.each($('form input'), function(input) {
allValid = input.val().length > 0
}
if ( allValid )
...
else
...
})
});
function areAllValid(inputs){
return Array.prototype.every.call(inputs, function(input) { return input.length > 0; });
}