JavaScript/Objekte/Array/every
Die Methode every aus Array.prototype prüft, ob eine Aussage für alle Elemente eines Arrays gültig ist. Diese Aussage hat die Form einer Funktion , die Sie als Callback an every
übergeben und die dann für die Array-Einträge aufgerufen wird.
Syntax
ergebnis = array.every(callback[, thisArg])
Folgende Parameter sind möglich:
callback
: Funktion, mit der die Array-Elemente überprüft werden. Sie erhält drei Argumente:currentValue
: aktuelles Element, das überprüft wirdindex
: Index des aktuellen Elementsarray
: der Array, der mitsome()
aufgerufen wurde
thisArg
: Optional. Derthis
-Wert, der beim Aufruf der Callback-Funktion gesetzt werden soll
Der Rückgabewert der Callback-Funktion wird automatisch in einen booleschen Wert konvertiert.
Achtung!
false
zurückgegeben hat. Danach bricht every
den Durchlauf ab, weil das Ergebnis nun feststeht. Beispiel
const numbers = [2,4,8,12,18];
const alleGerade = numbers.every(number => number % 2 == 0);
if (alleGerade)
console.log("Alle Einträge im Array sind gerade Zahlen");
Beschreibung
Die Methode every
erwartet als erstes Argument ein Prädikat, also eine Funktion, die ein Element des Arrays entgegennimmt und einen der booleschen Werte true
und false
zurückgibt. Diese Funktion wird von every
für jedes Element des Arrays aufgerufen, beginnend bei Index 0, bis zum Element mit dem höchsten Index. Sie erhält dabei das Element selbst, sein Index und eine Referenz auf das Array als Argumente. Gibt die Funktion für eines der Elemente false
zurück, wird die Ausführung von every
beendet und false
zurückgegeben, andernfalls true
.
Das ursprüngliche Array wird durch every
nicht verändert.
Wird every
auf einem leeren Array aufgerufen, dann ist der zurückgegebene Wert stets true
, unabhängig von der übergebenen Prädikatfunktion. Das liegt daran, dass in diesem Fall kein Element existiert, das die Aussage widerlegen könnte. Die übergebene Funktion wird nie aufgerufen. every
verhält sich also wie der Allquantor in der Prädikatenlogik.
Darüber hinaus besitzt every
einen optionalen zweiten Parameter, über den ein Wert für die Kontextvariable this
der Callbackfunktion angegeben werden kann. Diese Angabe hat allerdings keine Wirkung bei Pfeilfunktionen, da diese keine eigene Bindung für einen Funktionskontext besitzen.
Es werden von every
nur diejenigen Elemente des Arrays an die Callbackfunktion zur Prüfung übergeben, die zum Zeitpunkt des Aufrufs der Methode vorhanden waren. Später hinzugefügte Elemente werden nicht berücksichtigt. Wird ein Element in dem Array nach dem Aufruf von every
verändert oder gelöscht, so wird dies nur berücksichtigt, wenn das Element zu diesem Zeitpunkt noch nicht besucht wurde.
Wie die meisten anderen Array-Methoden auch, ist every nicht nur für echte Arrays verwendbar, sondern kann auch für andere, array-artige Objekte genutzt werden.
Beispiele
Im diesem Beispiel wird zunächst eine Liste von Objekten definiert, die Planeten unseres Sonnensystems repräsentieren. Mit Hilfe der Methode every
wird dann geprüft, ob alle Planeten über Monde verfügen. Die Aussage wird widerlegt, da weder Merkur noch Venus Monde besitzen. Eine zweite Prüfung mit der Methode every
, bei der getestet wird, ob jeder Wert der Eigenschaft radius
vom Typ Number ist, verläuft hingegen erfolgreich.
Hinweis zur Syntax: Ein Funktionsparameter in eckigen oder geschweiften Klammern stellt eine Destrukturierung dar.
const planets = [
{name: 'mercury', radius: 2440, satellites: 0},
{name: 'venus', radius: 6052, satellites: 0},
{name: 'earth', radius: 6371, satellites: 1},
{name: 'mars', radius: 3390, satellites: 2},
{name: 'jupiter', radius: 69911, satellites: 79},
{name: 'saturn', radius: 58232, satellites: 62},
{name: 'uranus', radius: 25362, satellites: 27}
]
const hasEveryPlanetSatellites = planets.every(({satellites}) => satellites !== 0);
if (hasEveryPlanetSatellites)
console.log("Jeder Planet hat Satelliten"); // wird nicht ausgegeben
const isEveryRadiusANumber = planets.every(({radius}) => !isNaN(radius));
if (isEveryRadiusANumber)
console.log("Für jeden Planeten ist ein Radius bekannt"); // wird ausgegeben
Im folgenden Beispiel wird every
auf eine Liste von booleschen Funktionen angewendet. Für die Konjunktion, die Disjunktion und die Implikation wird getestet, ob es eine Variablenbelegung gibt, für die alle Funktionen zu dem Wert true
evaluieren. Dazu wird die Methode some
auf der Liste der Wahrheitswerte aufgerufen und dabei eine Prädikatfunktion übergeben, die every
mit einer Funktion aufruft, die wiederum die booleschen Funktionen auf das jeweils aktuelle Paar Argumente anwendet.
const functions = [
(a, b) => a && b,
(a, b) => a || b,
(a, b) => !a || b
];
const values = [
[0, 0],
[0, 1],
[1, 0],
[1, 1]
]
const satisfied = values.some(([a, b]) => functions.every(f => f(a, b))); // ergibt true
Quellen
ECMA: Array.prototype.every
MDN: every