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 โจJuli 2015โฉ.
Die map()
-Methode von Array
-Instanzen erstellt ein neues Array, das mit den Ergebnissen einer bereitgestellten Funktion befรผllt wird, welche auf jedes Element des aufrufenden Arrays angewendet wird.
Probieren Sie es aus
const array = [1, 4, 9, 16];
// Pass a function to map
const mapped = array.map((x) => x * 2);
console.log(mapped);
// 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 map()
-Methode ist eine iterative Methode. Sie ruft eine bereitgestellte callbackFn
-Funktion einmal fรผr jedes Element in einem Array auf und konstruiert ein neues Array aus den Ergebnissen. Lesen Sie den Abschnitt iterative Methoden, um mehr darรผber zu erfahren, wie diese Methoden im Allgemeinen funktionieren.
callbackFn
wird nur fรผr Array-Indizes aufgerufen, denen Werte zugewiesen wurden. Sie wird nicht fรผr leere Slots in spรคrlichen Arrays aufgerufen.
Die map()
-Methode ist generisch. Sie erwartet nur, dass der this
-Wert eine length
-Eigenschaft und Attribute mit ganzzahligen Schlรผsseln hat.
Da map
ein neues Array erstellt, ist der Aufruf ohne Verwendung des zurรผckgegebenen Arrays ein Anti-Pattern; verwenden Sie stattdessen forEach
oder for...of
.
Beispiele
Abbildung eines Zahlenarrays in 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 zur Neuformatierung 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 (das durchlaufene Element) zu verwenden. Bestimmte Funktionen werden auch hรคufig mit einem Argument verwendet, obwohl sie zusรคtzliche optionale Argumente haben. Diese Gewohnheiten kรถnnen zu verwirrendem Verhalten fรผhren. Betrachten Sie folgendes:
["1", "2", "3"].map(parseInt);
Wรคhrend man [1, 2, 3] erwarten kรถnnte, ist das tatsรคchliche Ergebnis [1, NaN, NaN].
parseInt
wird hรคufig mit einem Argument verwendet, nimmt aber zwei. Das erste ist ein Ausdruck und das zweite ist das Zahlensystem (Radix). An die Callback-Funktion Array.prototype.map
werden 3 Argumente รผbergeben: das Element, der 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 andere Funktion, die nur ein Argument verwendet:
["1", "2", "3"].map((str) => parseInt(str, 10)); // [1, 2, 3]
Sie kรถnnen auch die Number
-Funktion verwenden, die nur ein Argument nimmt:
["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]
Weitere Diskussionen finden Sie in A JavaScript optional argument hazard von Allen Wirfs-Brock.
Abgebildetes Array enthรคlt undefiniert
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 zu signalisieren.
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-behaftete Abbildung
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, weil 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 so weit, dass das einzige Nรผtzliche, das map()
tut, ist, Seiteneffekte zu verursachen.
const products = [
{ name: "sports car" },
{ name: "laptop" },
{ name: "phone" },
];
products.map((product) => {
product.price = 100;
});
Wie bereits erwรคhnt, ist dies ein Anti-Pattern. Wenn Sie den Rรผckgabewert von map()
nicht verwenden, verwenden Sie stattdessen forEach()
oder eine for...of
-Schleife.
products.forEach((product) => {
product.price = 100;
});
Oder, wenn Sie stattdessen ein neues Array erstellen mรถchten:
const productsWithPrice = products.map((product) => ({
...product,
price: 100,
}));
Verwendung des dritten Arguments von callbackFn
Das array
-Argument ist nรผtzlich, wenn Sie ein anderes Element im Array zugreifen mรถchten, insbesondere wenn Sie keine vorhandene Variable haben, die auf das Array verweist. Das folgende Beispiel verwendet zuerst filter()
, um die positiven Werte zu extrahieren und dann map()
, um ein neues Array zu erstellen, bei dem jedes Element der Durchschnitt seiner Nachbarn und sich 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, auf das erstellte Array von der Callback-Funktion aus zuzugreifen.
Verwendung von map() auf spรคrlichen Arrays
Ein spรคrliches Array bleibt spรคrlich nach map()
. Die Indizes der leeren 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 map()
-Methode liest die length
-Eigenschaft von this
und ruft dann jede Eigenschaft ab, deren Schlรผssel eine nicht-negative Ganzzahl 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 eine Sammlung von Objekten durchlรคuft, die mit querySelectorAll
gesammelt wurden. Dies liegt daran, dass querySelectorAll
eine NodeList
(eine Sammlung von Objekten) zurรผckgibt. In diesem Fall geben wir alle ausgewรคhlten option
-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 die map()
-Methode zu verwenden.
Spezifikationen
Specification |
---|
ECMAScriptยฎ 2026 Language Specification # sec-array.prototype.map |
Browser-Kompatibilitรคt
Loadingโฆ