2013-03-18 18 views
15

muszę filtr jQuery/map każda funkcja/typ, aby sprawdzić, czy wszystkie elementy spełniają warunek:Sprawdź, czy wszystkie elementy spełniają warunek

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

Jeśli wszystkie wejścia mają długość> 0 someFunction powinien powrócić prawda. Coś takiego w jQuery?

+1

I nie myśl, że jQuery to ma. Underscore.js ma '$ .every()'. Powinno być proste do wdrożenia w jQuery przy użyciu '$ .filter'. – Barmar

+0

Uwaga, jeśli możesz znaleźć sposób na opisanie swojego stanu jako selektora, możesz sprawdzić liczbę elementów w kolekcji 'inputs.remove ('[value = ...]'. Length == 0' Something wzdłuż linii "select not empty selektor": http://stackoverflow.com/questions/10641258/jquery-select-data-attributes-that-arent-empty – AaronLS

+0

@Barmar, every() jest dokładnie tym, czego potrzebuję i przypadkowo mają podkreślenie jako zależność już :). dzięki – parliament

Odpowiedz

8

Odpowiedź brzmi TAK, posiada metodę grep, która może spełnić Twoje wymagania. Na przykład:

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

Nie testuję, może ma mały problem, ale powinien być prawie taki.

+0

Z dokumentów wygląda tak, że to zadziała, ale nie testowałem też. Skończyłem z Underscore.every(), jak już miałem to jako zależność i tak pasuje dokładnie wypełnić, zwracając boolean. – parliament

+6

Problem polega na tym, że jeśli drugi z tysięcy elementów nie spełnia wymagań, nadal będzie sprawdzał wszystkie następujące, zamiast przerywać pętlę i zwracać "fałsz". Ale działa. – bfontaine

3

Spowoduje to przejście przez każdą pozycję ORAZ warunek z poprzednim wynikiem, dzięki czemu zwróci wartość true tylko wtedy, gdy warunek jest spełniony dla wszystkich elementów. Oczywiście można zastąpić warunek funkcją wywołania zwrotnego i wykonać inputs.each( zamiast $('input'), ale konieczne może być nieco skorygowanie kodu w zależności od tego, czy dane wejściowe są obiektem jQuery, czy nie.

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

Niezupełnie, ale to łatwo utworzyć jeden:

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

Tu pracuje Test: http://jsbin.com/iwanof/2/

0

Zwykle używam następujący formularz, aby uzyskać wyniki w JQuery

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

W konkretnym przypadku będzie to wyglądać tak:

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

Nadzieja to zaoszczędzić trochę czasu.

+0

Myślę, że możesz również użyć 'inputs.map (function ...'. –

2

Do tego celu nie trzeba używać jQuery. Możesz to zrobić w natywnym kodzie JavaScript, używając Array.prototype.every, który jest obsługiwany w IE 9+.

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

Jeśli używasz ECMAScript 2015, można uporządkować go dalej:

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

to zasługuje na awans wyższy –

0

Istnieją pewne drobne problemy optymalizacyjne bezadresowa przez dotychczasowych odpowiedzi, więc rzucę mój kapelusz w ringu z tym, co uważam za najbardziej czytelny/wydajny kod.

Dodać metodę rozszerzenia jQuery jak ten, który będzie zwarcie:

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

Następnie nazwać tak:

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

Krótki trochę 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; }); 
} 
Powiązane problemy