2016-05-16 5 views
0

Ich habe diesen Code:JavaScript: Funktion nur ausführen, wenn alle Elemente im Array wahr sind?

// Required fields is an array of objects 

required_fields.each(function() { 

    // Check each field: If it has no value, do nothing. 
    if(!$(this).val()) { 
    return false; 
    } 

    // If all the fields are there, do something. 
    else { 
    alert('Doing something.'); 
    } 

}); 

Ich bin sicher, dass Sie das Problem sehen. Wenn die Funktion alert in der .each()-Funktion verwendet wird, wird die Warnung für jedes Element im Array ausgelöst. Aber was ich will, ist nur das Ereignis auszulösen, wenn ALLE Array-Elemente einen Wert haben - das heißt, wenn keine return false.

Was ist der richtige Weg, um nur etwas auszulösen, wenn alle Array-Elemente passieren?

Antwort

5

Implementieren Sie einfach einen kleinen Zähler für jeden Wert.

var valueCount = 0; 

required_fields.each(function() { 
    if (!$(this).val()) { 
    return false; 
    } else { 
    valueCount++; // increment to say has value 
    } 

}); 

if (valueCount == required_feilds.length) { 
    alert('Doing something.'); 
} 
+0

Der Grund, warum Sie "Return false" beibehalten, ist ein Kurzschluss. – andlrc

+0

@andlrc Ich weiß danke. realisierte, sobald ich den kleinen Kommentar editiert hatte. Schätze das Heads-Up! – Shakespeare

1

können Sie Array.prototype.every verwenden, die kurzgeschlossen wird, wenn ein falsy Wert ausgegeben:

var isTrue = [].every.call(required_fields, function(el) { 
    return $(el).val(); 
}); 

if (isTrue) { 
    console.log('Doing something'); 
} 

Ich glaube nicht, dass Sie ein Array haben aber ein jQuery-Objekt, das Array ist wie (got Länge und 0, 1 ... Eigenschaften) So können Sie (ab) verwenden die native Array-Prototyp durch den Kontext mit .call Einstellung:

var every = Array.prototype.every; 
every.call({ '0': 'a', '1': 'b', length: 2 }, console.log.bind(console)); 
// will output 
// ['a', 0] 
// ['b', 1] 

Jetzt, wo ich daran denke jQuery.fn.each wird auch Kurzschluss, wenn false zurückgegeben wird.

1

zwei Hauptoptionen stehen aus: 1: eine einfache Funktion schreiben, die ein Array von jQuery Objekte nimmt und gibt true zurück, wenn alle Elemente im Array Wert haben

var allHaveValue = function(array){ 
    for(var i = 0; i < array.length; i++){ 
     if(!$(array[i]).val()){ 
      return false; 
     } 
    } 
    return true; 
}; 

// For your example 
if(allHaveValue(required_fields)){ 
    // Proceed 
} else{ 
    // Handle errors 
} 

Die andere Alternative, die gleiche Sache tut aber mit der Funktion underscore.js für [alle] [1]

[1]: http://underscorejs.org/#every was das gleiche tut. Der Anruf würde wie folgt aussehen:

var allHaveValue = _.every(required_fields, function(item){ 
    return $(item).val(); 
}); 

if(allHaveValue)}{ 
    // Proceed 
} else{ 
    // Handle errors 
} 
Verwandte Themen