Array.prototype.map()
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
map() æ¹æ³å建ä¸ä¸ªæ°æ°ç»ï¼è¿ä¸ªæ°æ°ç»ç±åæ°ç»ä¸çæ¯ä¸ªå
ç´ é½è°ç¨ä¸æ¬¡æä¾ç彿°åçè¿åå¼ç»æã
å°è¯ä¸ä¸
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]
è¯æ³
map(callbackFn)
map(callbackFn, thisArg)
åæ°
callbackFn-
为æ°ç»ä¸çæ¯ä¸ªå ç´ æ§è¡ç彿°ãå®çè¿åå¼ä½ä¸ºä¸ä¸ªå ç´ è¢«æ·»å ä¸ºæ°æ°ç»ä¸ãè¯¥å½æ°è¢«è°ç¨æ¶å°ä¼ å ¥ä»¥ä¸åæ°ï¼
thisArgå¯é-
æ§è¡
callbackFnæ¶ç¨ä½thisçå¼ãåè§è¿ä»£æ¹æ³ã
è¿åå¼
ä¸ä¸ªæ°æ°ç»ï¼æ¯ä¸ªå ç´ é½æ¯åè°å½æ°çè¿åå¼ã
æè¿°
map() æ¹æ³æ¯ä¸ä¸ªè¿ä»£æ¹æ³ãå®ä¸ºæ°ç»ä¸çæ¯ä¸ªå
ç´ è°ç¨ä¸æ¬¡æä¾ç callbackFn 彿°ï¼å¹¶ç¨ç»ææå»ºä¸ä¸ªæ°æ°ç»ã
callbackFn ä»
å¨å·²åé
å¼çæ°ç»ç´¢å¼å¤è¢«è°ç¨ãå®ä¸ä¼å¨ç¨çæ°ç»ä¸ç空槽å¤è¢«è°ç¨ã
map() æ¹æ³æ¯ä¸ä¸ªå¤å¶æ¹æ³ãå®ä¸ä¼æ¹å thisãç¶èï¼ä½ä¸º callbackFn æä¾ç彿°å¯ä»¥æ´æ¹æ°ç»ã请注æï¼å¨ç¬¬ä¸æ¬¡è°ç¨ callbackFn ä¹åï¼æ°ç»çé¿åº¦å·²ç»è¢«ä¿åãå æ¤ï¼
- å½å¼å§è°ç¨
map()æ¶ï¼callbackFnå°ä¸ä¼è®¿é®è¶ åºæ°ç»åå§é¿åº¦çä»»ä½å ç´ ã - 对已访é®ç´¢å¼çæ´æ¹ä¸ä¼å¯¼è´å次å¨è¿äºå
ç´ ä¸è°ç¨
callbackFnã - 妿æ°ç»ä¸ä¸ä¸ªç°æçãå°æªè®¿é®çå
ç´ è¢«
callbackFnæ´æ¹ï¼åå®ä¼ éç»callbackFnçå¼å°æ¯è¯¥å ç´ è¢«ä¿®æ¹åçå¼ã被å é¤çå ç´ åä¸ä¼è¢«è®¿é®ã
è¦åï¼ä¸è¿°ç±»åçå¹¶åä¿®æ¹ç»å¸¸å¯¼è´é¾ä»¥çè§£ç代ç ï¼é常åºé¿å ï¼ç¹æ®æ åµé¤å¤ï¼ã
map() æ¹æ³æ¯éç¨çãå®åªææ this å¼å
·æ length 屿§åæ´æ°é®å±æ§ã
ç±äº map å建ä¸ä¸ªæ°æ°ç»ï¼å¨æ²¡æä½¿ç¨è¿åçæ°ç»çæ
åµä¸è°ç¨å®æ¯ä¸æ°å½çï¼åºè¯¥ä½¿ç¨ forEach æ for...of ä½ä¸ºä»£æ¿ã
示ä¾
>æ±æ°ç»ä¸æ¯ä¸ªå ç´ çå¹³æ¹æ ¹
ä¸é¢ç代ç å建äºä¸ä¸ªæ°æ°ç»ï¼å¼ä¸ºåæ°ç»ä¸å¯¹åºæ°åçå¹³æ¹æ ¹ã
const numbers = [1, 4, 9];
const roots = numbers.map((num) => Math.sqrt(num));
// roots ç°å¨æ¯ [1, 2, 3]
// numbers 便§æ¯ [1, 4, 9]
ä½¿ç¨ map éæ°æ ¼å¼åæ°ç»ä¸ç对象
以ä¸ä»£ç 使ç¨ä¸ä¸ªå å«å¯¹è±¡çæ°ç»æ¥éæ°å建ä¸ä¸ªæ ¼å¼ååçæ°ç»ã
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 }
// ]
使ç¨å å«åä¸ªåæ°ç彿°æ¥æ å°ä¸ä¸ªæ°åæ°ç»
ä¸é¢ç代ç 表示äºå½å½æ°éè¦ä¸ä¸ªåæ°æ¶ map ç工使¹å¼ãå½ map 循ç¯éååå§æ°ç»æ¶ï¼è¿ä¸ªåæ°ä¼èªå¨è¢«åé
ææ°ç»ä¸å¯¹åºçæ¯ä¸ªå
ç´ ã
const numbers = [1, 4, 9];
const doubles = numbers.map((num) => num * 2);
console.log(doubles); // [2, 8, 18]
console.log(numbers); // [1, 4, 9]
å¨éæ°ç»å¯¹è±¡ä¸è°ç¨ map()
map() æ¹æ³è¯»å this ç length 屿§ï¼ç¶åè®¿é®æ¯ä¸ªæ´æ°ç´¢å¼ã
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
};
console.log(Array.prototype.map.call(arrayLike, (x) => x ** 2));
// [ 4, 9, 16 ]
å¨ NodeList ä¸éç¨å°ä½¿ç¨ map()
以ä¸ç¤ºä¾å±ç¤ºäºå¦ä½å»éåéè¿ querySelectorAll å¾å°ç对象éåãè¿æ¯å 为 querySelectorAll è¿åçæ¯ä¸ä¸ªå¯¹è±¡éå NodeListã
å¨è¿ç§æ
åµä¸ï¼æä»¬è¿åå±å¹ä¸ææéä¸ option çå¼ï¼
const elems = document.querySelectorAll("select option:checked");
const values = Array.prototype.map.call(elems, ({ value }) => value);
ä¸ç§æ´ç®åçæ¹å¼æ¯ç¨ Array.from() æ¹æ³ã
å¨ç¨çæ°ç»ä¸ä½¿ç¨ map()
ç¨çæ°ç»å¨ä½¿ç¨ map() æ¹æ³åä»ç¶æ¯ç¨ççã空槽çç´¢å¼å¨è¿åçæ°ç»ä¸ä»ç¶ä¸ºç©ºï¼å¹¶ä¸åè°å½æ°ä¸ä¼å¯¹å®ä»¬è¿è¡è°ç¨ã
console.log(
[1, , 3].map((x, index) => {
console.log(`Visit ${index}`);
return x * 2;
}),
);
// Visit 0
// Visit 2
// [2, empty, 6]
å° parseInt() ä¸ map() ä¸èµ·ä½¿ç¨
ï¼åå°è¿ç¯åæçå¯åï¼
é常æ åµä¸ï¼æä»¬ä½¿ç¨åªæä¸ä¸ªåæ°ï¼å³æ£å¨éåçå ç´ ï¼çåè°å½æ°ã尽管æäºå½æ°å¯ä»¥æ¥åé¢å¤çå¯éåæ°ï¼ä½å¨å®é åºç¨ä¸ï¼æä»¬é常åªä¼ éä¸ä¸ªåæ°ãè¿ç§ä¹ æ¯å¯è½ä¼å¯¼è´ä¸äºä»¤äººå°æçç°è±¡ã
èèä¸ä¾ï¼
["1", "2", "3"].map(parseInt);
æä»¬ææè¾åº [1, 2, 3], èå®é
ç»ææ¯ [1, NaN, NaN].
parseInt 彿°é常åªä½¿ç¨ä¸ä¸ªåæ°ï¼ä½å
¶å®å¯ä»¥ä¼ å
¥ä¸¤ä¸ªåæ°ã第ä¸ä¸ªåæ°æ¯è¡¨è¾¾å¼ï¼ç¬¬äºä¸ªåæ°æ¯è§£æè¯¥è¡¨è¾¾å¼çåºæ°ãå½å¨ Array.prototype.map çåè°å½æ°ä¸ä½¿ç¨ parseInt 彿°æ¶ï¼map æ¹æ³ä¼ä¼ é 3 ä¸ªåæ°ï¼
- å ç´
- ç´¢å¼
- æ°ç»
parseInt 彿°ä¼å¿½ç¥ç¬¬ä¸ä¸ªåæ°ï¼ä½æ¯ä¸ä¼å¿½ç¥ç¬¬äºä¸ªåæ°ï¼è¿å¯è½ä¼å¯¼è´ä¸äºé®é¢ã
以䏿¯è¿ä»£æ¥éª¤çç®æç¤ºä¾ï¼
// parseInt(string, radix) -> map(parseInt(value, index))
/* ç¬¬ä¸æ¬¡è¿ä»£ (index æ¯ 0): */ parseInt("1", 0); // 1
/* ç¬¬äºæ¬¡è¿ä»£ (index æ¯ 1): */ parseInt("2", 1); // NaN
/* ç¬¬ä¸æ¬¡è¿ä»£ (index æ¯ 2): */ parseInt("3", 2); // NaN
ä¸é¢è®©æä»¬æ¥è®¨è®ºè§£å³æ¹æ¡ï¼
const returnInt = (element) => parseInt(element, 10);
["1", "2", "3"].map(returnInt); // [1, 2, 3]
// å®é
ç»ææ¯ä¸ä¸ªæ°åæ°ç»ï¼å¦é¢æï¼
// ä¸ä¸é¢ç¸åï¼ä½ä½¿ç¨ç®æ´çç®å¤´å½æ°è¯æ³
["1", "2", "3"].map((str) => parseInt(str)); // [1, 2, 3]
// å®ç°ä¸è¿°ç®æ æ´ç®åçæ¹æ³ï¼åæ¶é¿å
äºâéªæâï¼
["1", "2", "3"].map(Number); // [1, 2, 3]
// ä½ä¸ parseInt() ä¸åï¼Number() è¿ä¼è¿åä¸ä¸ªæµ®ç¹æ°æï¼è§£æï¼ææ°è¡¨ç¤ºæ³ï¼
["1.1", "2.2e2", "3e300"].map(Number); // [1.1, 220, 3e+300]
// 为äºè¿è¡æ¯è¾ï¼å¦ææä»¬å¯¹ä¸é¢çæ°ç»ä½¿ç¨ parseInt():
["1.1", "2.2e2", "3e300"].map((str) => parseInt(str)); // [1, 2, 3]
ä½¿ç¨ parseInt ä½ä¸ºåæ°è°ç¨ map æ¹æ³ï¼è¾åºè¿è¡å¦ä¸ï¼
const strings = ["10", "10", "10"];
const numbers = strings.map(parseInt);
console.log(numbers);
// æ ¹æ®ä»¥ä¸æè¿°ï¼[10, NaN, 2] çå®é
ç»æå¯è½ä¼åºä¹ææã
æ å°å å« undefined çæ°ç»
å½è¿å undefined ææ²¡æè¿åä»»ä½å
容æ¶ï¼
const numbers = [1, 2, 3, 4];
const filteredNumbers = numbers.map((num, index) => {
if (index < 3) {
return num;
}
});
// index ä» 0 å¼å§ï¼å æ¤ filterNumbers 为 1ã2ã3 å undefinedã
// filteredNumbers æ¯ [1, 2, 3, undefined]
// numbers 便§æ¯ [1, 2, 3, 4]
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.map> |