JavaScript/Objekte/Array/every

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Methode every kann verwendet werden um zu prüfen, ob eine Aussage für alle Elemente eines Arrays gültig ist, wobei die Prüfung mittels einer Callbackfunktion erfolgt, die als Argument an every übergeben und dann auf die Elemente des Arrays angewendet wird.


Syntax

Array.prototype.every(callback(element[, index[, array]])[, thisArg])


Attribute
Writable true
Enumerable false
Configurable true



Beispiel
const primes = [2,3,5,7,11,13,17,19,23]


primes.every(number => number < 25) // true

Beschreibung[Bearbeiten]

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, wobei das Element selbst, sein Index und eine Referenz auf das Array übergeben werden. 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 exisitert, 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.

Die Methode every ist generisch formuliert, sie muss also nicht zwingend auf einem Array aufgerufen werden, sondern kann auch im Kontext von Array-ähnlichen oder iterierbaren Objekten ausgeführt werden.

Beispiele[Bearbeiten]

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.


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)

hasEveryPlanetSatellites // false



const isEveryRadiusANumber = planets.every(({radius}) => !isNaN(radius))

isEveryRadiusANumber // true


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)))

satisfied // true

Quellen[Bearbeiten]

ECMA: Array.prototype.every

MDN: every