2013-03-18 16 views
15

ho bisogno di un/map/ogni funzione del tipo di filtro jQuery per verificare se tutti gli elementi soddisfano una condizione:Verificare che tutti gli elementi soddisfano una condizione

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

se tutti gli ingressi hanno lunghezza> 0 someFunction deve restituire true. Qualcosa di simile in jQuery?

+1

I non pensare che jQuery abbia questo. Underscore.js ha '$ .every()'. Dovrebbe essere semplice da implementare in jQuery usando '$ .filter'. – Barmar

+0

Nota: se riesci a trovare un modo per descrivere la tua condizione come selettore, puoi controllare il numero di elementi nella raccolta 'input.remove ('[value = ...]'). Length == 0' Something sulla falsariga di un "selettore valore non vuoto": http://stackoverflow.com/questions/10641258/jquery-select-data-attributes-that-arent-empty – AaronLS

+0

@Barmar, every() è esattamente ciò di cui ho bisogno e per coincidenza ho sottolineato come una dipendenza già :). grazie – parliament

risposta

8

La risposta è SI, ha un metodo grep in grado di soddisfare le vostre esigenze. Ad esempio:

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

Non lo provo, forse ha un piccolo problema ma dovrebbe essere quasi come questo.

+0

Da documenti come questo funzionerebbe, ma non ho provato neanche. Ho finito per andare con Underscore.every() come ho già avuto come dipendenza comunque e si adatta esattamente al riempimento, restituendo un booleano. – parliament

+6

Il problema è che se il secondo dei tuoi migliaia di elementi non soddisfa il requisito, controllerà comunque tutti i seguenti invece di interrompere il ciclo e restituire 'false'. Ma funziona. – bfontaine

3

Questo passerà attraverso ogni elemento, E la condizione con il risultato precedente, in modo che restituirà true solo se la condizione è vera per tutti gli elementi. Ovviamente è possibile sostituire la condizione con una funzione di callback e fare inputs.each( anziché $('input') ma potrebbe essere necessario regolare leggermente il codice a seconda che gli input siano o meno un oggetto jQuery.

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

esattamente, ma è facile creare uno:

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

Qui sta lavorando prova: http://jsbin.com/iwanof/2/

0

io di solito uso seguente modulo per ottenere le partite in JQuery

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

Nel tuo caso specifico assomiglierebbe a questo:

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

Spero che questo ti consente di risparmiare un po 'di tempo.

+0

Penso che si possa usare anche 'inputs.map (funzione ...'. –

2

Non è necessario utilizzare jQuery per eseguire questa operazione. Puoi farlo in JavaScript nativo usando Array.prototype.every, che è supportato in IE 9+.

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

Se si utilizza EcmaScript 2015, è possibile riordinare l'alto ulteriormente:

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

questo merita di essere svitato più in alto –

0

Ci sono alcuni problemi di ottimizzazione minori non indirizzati dalle risposte esistenti, così mi butto il mio cappello sul ring con quello che credo sia il codice più leggibile/performante.

Aggiungi un metodo di estensione jQuery come questo, che sarà corto circuito:

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

Poi chiamare in questo modo:

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

rapida po '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; }); 
} 
Problemi correlati