2013-03-18 19 views
15

erfüllen muss ich ein jQuery-Filter/map/jede Art Funktion zu überprüfen, ob alle Elemente eine Bedingung erfüllen:Überprüfen Sie, ob alle Elemente, die eine Bedingung

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

wenn alle Eingänge haben Länge> 0 someFunction sollte true zurückgeben. Alles in jQuery?

+1

I glaube nicht, dass jQuery das hat. Underscore.js hat '$ .every()'. Es sollte einfach sein, in jQuery mit '$ .filter 'zu implementieren. – Barmar

+0

Hinweis: Wenn Sie eine Möglichkeit finden, Ihre Bedingung als Selektor zu beschreiben, können Sie die Anzahl der Elemente in der Sammlung 'inputs.remove (' [Wert = ...] ') überprüfen. Length == 0' Etwas im Sinne eines "Wert nicht leer Selektor": http://StackOverflow.com/Questions/10641258/Jquery-Select-Data-Attributes-that-arent-Empty – AaronLS

+0

@Barmar, jeder() ist genau das, was ich brauche und Zufällig habe ich schon als Abhängigkeit unterstrichen :). danke – parliament

Antwort

8

Die Antwort ist JA, es hat eine Methode Grep, die Ihre Anforderung erfüllen kann. Zum Beispiel:

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

teste ich es nicht, vielleicht hat es winziges Problem sollte aber fast so sein.

+0

Aus der Dokumentation sieht das so aus, aber ich habe auch nicht getestet. Ich endete mit Underscore.every(), da ich das sowieso schon als Abhängigkeit hatte, und es passte genau an die Füllung und gab einen booleschen Wert zurück. – parliament

+6

Das Problem dabei ist, dass, wenn das zweite Ihrer Tausende von Elementen die Anforderung nicht erfüllt, es immer noch alle folgenden überprüfen wird, anstatt die Schleife zu unterbrechen und 'false' zurückzugeben. Aber es funktioniert. – bfontaine

3

Dies wird durch jedes Element gehen UND die Bedingung mit dem vorherigen Ergebnis, so dass es nur wahr zurückgibt, wenn die Bedingung für alle Elemente erfüllt ist. Sie könnten natürlich die Bedingung durch eine Callback-Funktion ersetzen, und tun Sie inputs.each( anstelle von $('input'), aber Sie müssen möglicherweise den Code ein bisschen anpassen abhängig davon, ob Eingänge ein jquery Objekt oder nicht ist.

var all = true; 
    $('input').each(function(index, value) { 
    all = all & ($(value).val().length > 0); 
    }); 
return all; 
0

Nicht genau, aber es ist einfach zu erstellen:

$.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); 
     }; 

Hier arbeitet Test: http://jsbin.com/iwanof/2/

0

Ich verwende in der Regel Form folgende Spiele in JQuery zu bekommen

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

In Ihrem speziellen Fall würde es so aussehen:

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

Hope this Sie einige Zeit spart.

+0

Ich denke, Sie können auch 'inputs.map (function ...'. –

2

Sie müssen dazu nicht jQuery verwenden. Sie können dies in nativem JavaScript mit Array.prototype.every tun, das in IE 9+ unterstützt wird.

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

Wenn Sie EcmaScript 2015 verwenden, können Sie es ordentlich weiter nach oben:

var areAllValid = inputs => inputs.every(input => input.length > 0); 
+0

dies verdient höher upvoted verwendet werden –

0

Es gibt einige kleinere Optimierungsprobleme unadressierte durch die vorhandenen Antworten, also werde ich meinen Hut in den Ring werfen mit dem, was ich glaube, ist der lesbarste/performanteste Code.

ein jQuery-Erweiterung Methode wie folgt hinzufügen, die wird Kurzschluss:

/** 
* 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; 
}; 

Dann es so nennen:

var allValid = $("form :input").all(function() { 
        return $(this).valid(); 
       }); 
0

Schnell wenig jQuery:

$(document).ready(function() { 
    $('form input').keyUp(function() { 
    var allValid = true; 
    $.each($('form input'), function(input) { 
     allValid = input.val().length > 0 
    } 
    if (allValid) 
     ... 
    else 
     ... 
    }) 
}); 
0
function areAllValid(inputs){ 
    return Array.prototype.every.call(inputs, function(input) { return input.length > 0; }); 
} 
Verwandte Themen