JavaScript/Objekte/Array/every

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

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 wird
    • index: Index des aktuellen Elements
    • array: der Array, der mit some() aufgerufen wurde
  • thisArg: Optional. Der this-Wert, der beim Aufruf der Callback-Funktion gesetzt werden soll

Der Rückgabewert der Callback-Funktion wird automatisch in einen booleschen Wert konvertiert.

Achtung!

Die Callback-Funktion wird nur so lange aufgerufen, bis sie einmal false zurückgegeben hat. Danach bricht every den Durchlauf ab, weil das Ergebnis nun feststeht.

Beispiel

Prüfen eines Arrays, ob es nur gerade Zahlen enthält
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.

Beispiel
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.


Beispiel
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