Array.prototype.map()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Die Methode map()
von Array
Instanzen erstellt ein neues Array, das mit den Ergebnissen der Aufrufe einer bereitgestellten Funktion auf jedes Element des aufrufenden Arrays gefüllt ist.
Probieren Sie es aus
const array1 = [1, 4, 9, 16];
// Pass a function to map
const map1 = array1.map((x) => x * 2);
console.log(map1);
// Expected output: Array [2, 8, 18, 32]
Syntax
map(callbackFn)
map(callbackFn, thisArg)
Parameter
callbackFn
-
Eine Funktion, die für jedes Element im Array ausgeführt wird. Ihr Rückgabewert wird als einzelnes Element im neuen Array hinzugefügt. Die Funktion wird mit den folgenden Argumenten aufgerufen:
thisArg
Optional-
Ein Wert, der als
this
verwendet wird, wenncallbackFn
ausgeführt wird. Siehe iterative Methoden.
Rückgabewert
Ein neues Array, bei dem jedes Element das Ergebnis der Callback-Funktion ist.
Beschreibung
Die Methode map()
ist eine iterative Methode. Sie ruft eine bereitgestellte callbackFn
-Funktion einmal für jedes Element eines Arrays auf und erstellt aus den Ergebnissen ein neues Array. Lesen Sie den Abschnitt zu iterativen Methoden für weitere Informationen darüber, wie diese Methoden im Allgemeinen funktionieren.
callbackFn
wird nur für Array-Indexe aufgerufen, für die Werte zugewiesen wurden. Es wird nicht für leere Plätze in spärlichen Arrays aufgerufen.
Die Methode map()
ist generisch. Sie erwartet nur, dass der this
-Wert eine length
-Eigenschaft und integerindizierte Eigenschaften hat.
Da map
ein neues Array erstellt, ist es ein Anti-Pattern, es ohne Verwendung des zurückgegebenen Arrays aufzurufen; verwenden Sie stattdessen forEach
oder for...of
.
Beispiele
Abbilden eines Zahlenarrays auf ein Array von Quadratwurzeln
Der folgende Code nimmt ein Array von Zahlen und erstellt ein neues Array, das die Quadratwurzeln der Zahlen im ersten Array enthält.
const numbers = [1, 4, 9];
const roots = numbers.map((num) => Math.sqrt(num));
// roots is now [1, 2, 3]
// numbers is still [1, 4, 9]
Verwendung von map zum Umformatieren von Objekten in einem Array
Der folgende Code nimmt ein Array von Objekten und erstellt ein neues Array, das die neu formatierten Objekte enthält.
const kvArray = [
{ key: 1, value: 10 },
{ key: 2, value: 20 },
{ key: 3, value: 30 },
];
const reformattedArray = kvArray.map(({ key, value }) => ({ [key]: value }));
console.log(reformattedArray); // [{ 1: 10 }, { 2: 20 }, { 3: 30 }]
console.log(kvArray);
// [
// { key: 1, value: 10 },
// { key: 2, value: 20 },
// { key: 3, value: 30 }
// ]
Verwendung von parseInt() mit map()
Es ist üblich, den Callback mit einem Argument zu verwenden (das durchlaufene Element). Bestimmte Funktionen werden ebenfalls häufig mit einem Argument verwendet, auch wenn sie zusätzliche optionale Argumente annehmen. Diese Gewohnheiten können zu verwirrenden Verhaltensweisen führen. Betrachten Sie:
["1", "2", "3"].map(parseInt);
Während man [1, 2, 3]
erwarten könnte, ist das tatsächliche Ergebnis [1, NaN, NaN]
.
parseInt
wird oft mit einem Argument verwendet, nimmt aber zwei an. Das erste ist ein Ausdruck und das zweite ist die Basis für die Callback-Funktion, Array.prototype.map
übergibt 3 Argumente: das Element, den Index und das Array. Das dritte Argument wird von parseInt
ignoriert — aber nicht das zweite! Dies ist die Quelle möglicher Verwirrung.
Hier ist ein prägnantes Beispiel der Iterationsschritte:
/* first iteration (index is 0): */ parseInt("1", 0); // 1
/* second iteration (index is 1): */ parseInt("2", 1); // NaN
/* third iteration (index is 2): */ parseInt("3", 2); // NaN
Um dies zu lösen, definieren Sie eine weitere Funktion, die nur ein Argument annimmt:
["1", "2", "3"].map((str) => parseInt(str, 10)); // [1, 2, 3]
Sie können auch die Number
-Funktion verwenden, die nur ein Argument annimmt:
["1", "2", "3"].map(Number); // [1, 2, 3]
// But unlike parseInt(), Number() will also return a float or (resolved) exponential notation:
["1.1", "2.2e2", "3e300"].map(Number); // [1.1, 220, 3e+300]
// For comparison, if we use parseInt() on the array above:
["1.1", "2.2e2", "3e300"].map((str) => parseInt(str, 10)); // [1, 2, 3]
Siehe A JavaScript optional argument hazard von Allen Wirfs-Brock für weitere Diskussionen.
Abgebildetes Array enthält undefined
Wenn undefined
oder nichts zurückgegeben wird, enthält das resultierende Array undefined
. Wenn Sie das Element stattdessen löschen möchten, verketten Sie eine filter()
-Methode oder verwenden Sie die flatMap()
-Methode und geben Sie ein leeres Array zurück, um die Löschung anzuzeigen.
const numbers = [1, 2, 3, 4];
const filteredNumbers = numbers.map((num, index) => {
if (index < 3) {
return num;
}
});
// index goes from 0, so the filterNumbers are 1,2,3 and undefined.
// filteredNumbers is [1, 2, 3, undefined]
// numbers is still [1, 2, 3, 4]
Seiteneffekt-behaftetes Mapping
Der Callback kann Seiteneffekte haben.
const cart = [5, 15, 25];
let total = 0;
const withTax = cart.map((cost) => {
total += cost;
return cost * 1.2;
});
console.log(withTax); // [6, 18, 30]
console.log(total); // 45
Dies wird nicht empfohlen, da Kopiermethoden am besten mit reinen Funktionen verwendet werden. In diesem Fall können wir wählen, das Array zweimal zu durchlaufen.
const cart = [5, 15, 25];
const total = cart.reduce((acc, cost) => acc + cost, 0);
const withTax = cart.map((cost) => cost * 1.2);
Manchmal geht dieses Muster ins Extrem und das einzige Nützliche, was map()
tut, ist das Erzeugen von Seiteneffekten.
const products = [
{ name: "sports car" },
{ name: "laptop" },
{ name: "phone" },
];
products.map((product) => {
product.price = 100;
});
Wie zuvor erwähnt, ist dies ein Anti-Pattern. Wenn Sie den Rückgabewert von map()
nicht verwenden, verwenden Sie forEach()
oder eine for...of
Schleife stattdessen.
products.forEach((product) => {
product.price = 100;
});
Oder, wenn Sie stattdessen ein neues Array erstellen möchten:
const productsWithPrice = products.map((product) => {
return { ...product, price: 100 };
});
Verwendung des dritten Arguments von callbackFn
Das array
-Argument ist nützlich, wenn Sie auf ein anderes Element im Array zugreifen möchten, insbesondere wenn Sie keine vorhandene Variable haben, die auf das Array verweist. Im folgenden Beispiel wird zuerst filter()
verwendet, um die positiven Werte zu extrahieren, und dann map()
, um ein neues Array zu erstellen, bei dem jedes Element der Durchschnitt seiner Nachbarn und es selbst ist.
const numbers = [3, -1, 1, 4, 1, 5, 9, 2, 6];
const averaged = numbers
.filter((num) => num > 0)
.map((num, idx, arr) => {
// Without the arr argument, there's no way to easily access the
// intermediate array without saving it to a variable.
const prev = arr[idx - 1];
const next = arr[idx + 1];
let count = 1;
let total = num;
if (prev !== undefined) {
count++;
total += prev;
}
if (next !== undefined) {
count++;
total += next;
}
const average = total / count;
// Keep two decimal places
return Math.round(average * 100) / 100;
});
console.log(averaged); // [2, 2.67, 2, 3.33, 5, 5.33, 5.67, 4]
Das array
-Argument ist nicht das Array, das erstellt wird — es gibt keine Möglichkeit, vom Callback aus auf das erstellte Array zuzugreifen.
Verwendung von map() bei sparsamen Arrays
Ein spärliches Array bleibt nach map()
spärlich. Die Indizes leerer Slots bleiben im zurückgegebenen Array leer, und die Callback-Funktion wird nicht auf sie angewendet.
console.log(
[1, , 3].map((x, index) => {
console.log(`Visit ${index}`);
return x * 2;
}),
);
// Visit 0
// Visit 2
// [2, empty, 6]
Aufrufen von map() auf Nicht-Array-Objekten
Die Methode map()
liest die length
-Eigenschaft von this
und greift dann auf jede Eigenschaft zu, deren Schlüssel eine nicht negative ganze Zahl kleiner als length
ist.
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
3: 5, // ignored by map() since length is 3
};
console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
// [ 4, 9, 16 ]
Dieses Beispiel zeigt, wie man durch eine Sammlung von Objekten iteriert, die durch querySelectorAll
gesammelt wurden. Dies liegt daran, dass querySelectorAll
eine NodeList
zurückgibt (welche eine Sammlung von Objekten ist). In diesem Fall geben wir alle ausgewählten option
s-Werte auf dem Bildschirm zurück:
const elems = document.querySelectorAll("select option:checked");
const values = Array.prototype.map.call(elems, ({ value }) => value);
Sie können auch Array.from()
verwenden, um elems
in ein Array zu transformieren und dann auf die map()
-Methode zuzugreifen.
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-array.prototype.map |