Проверьте, удовлетворяют ли все элементы условию
Мне нужна функция jQuery filter/map/each type, чтобы проверить, удовлетворяют ли элементы ALL условием:
function areAllValid(inputs){
return $.someFunction(inputs, function(input) { return input.length > 0; });
}
Если для ВСЕХ входов длинa > 0 someFunction
должна возвращать значение true. Что-нибудь подобное в jQuery?
Ответы
Ответ 1
Ответ: ДА, у него есть метод grep, который может удовлетворить ваши требования. Например:
inputs= jQuery.grep(inputs, function(input){
return input.length>0;
});
if(inputs.length>0) return true;
return false;
Я не тестирую его, возможно, у него крошечная проблема, но должна быть почти такой.
Ответ 2
Это будет проходить через каждый элемент и условие с предыдущим результатом, так что оно вернет true, если условие истинно для всех элементов. Разумеется, вы можете заменить условие функцией обратного вызова и сделать inputs.each(
вместо $('input')
, но вам может потребоваться немного отрегулировать код в зависимости от того, является ли входной объект jquery или нет.
var all = true;
$('input').each( function(index, value) {
all = all & ($(value).val().length > 0);
});
return all;
Ответ 3
Вам не нужно использовать jQuery для этого. Вы можете сделать это на родном JavaScript, используя Array.prototype.every, который поддерживается в 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);
Ответ 4
Не совсем, но его легко создать:
$.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/
Ответ 5
Я обычно использую следующую форму для получения совпадений в JQuery
$.map($("[some selector]"), function(e) {
return ([some matching mechanism]);
}).indexOf(false) == -1;
В вашем конкретном случае это будет выглядеть так:
$.map(inputs, function(e) {
return (e.length > 0);
}).indexOf(false) == -1;
Ответ 6
Есть некоторые незначительные проблемы оптимизации, не затрагиваемые существующими ответами, поэтому я брошу свою шляпу на ринг с тем, что, по моему мнению, является наиболее читаемым/исполняемым кодом.
Добавьте способ расширения 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();
});
Ответ 7
Быстрый маленький jQuery:
$(document).ready(function() {
$('form input').keyUp(function() {
var allValid = true;
$.each($('form input'), function(input) {
allValid = input.val().length > 0
}
if ( allValid )
...
else
...
})
});
Ответ 8
function areAllValid(inputs){
return Array.prototype.every.call(inputs, function(input) { return input.length > 0; });
}