Array.prototype.map()方法详解
Array.prototype.map()
1 语法
- const new_array = arr.map(callback[, thisArg])
2 简单栗子
- let arr = [1, 5, 10, 15];
- let newArr = arr.map(function(x) {
- return x * 2;
- });
- // arr is now [2, 10, 20, 30]
- // newArr is still [1, 5, 10, 15]
3 参数说明
- callback
- 生成新数组元素的函数,使用三个参数:
- currentValue
- callback 的第一个参数,数组中正在处理的当前元素。
- index
- callback 的第二个参数,数组中正在处理的当前元素的索引。
- array
- callback 的第三个参数,map 方法被调用的数组。
- thisArg
- 可选的。执行 callback 函数时 使用的this 值。
4 返回值
一个新数组,每个元素都是回调函数的结果。
5 详细说明
- map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。
- callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。
- 如果 thisArg 参数有值,则每次 callback 函数被调用的时候,this 都会指向 thisArg 参数上的这个对象。如果省略了 thisArg 参数,或者赋值为 null 或 undefined,则 this 指向全局对象 。
- map 不修改调用它的原数组本身(当然可以在 callback 执行时改变原数组)。
- 使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中:原数组中新增加的元素将不会被 callback 访问到;若已经存在的元素被改变或删除了,则它们的传递到 callback 的值是 map 方法遍历到它们的那一时刻的值;而被删除的元素将不会被访问到。
6 示列
6.1 使用map格式化数组中的对象
- var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
- var reformattedArray = kvArray.map(function(obj){
- var rObj = {};
- rObj[obj.key] = obj.value;
- return rObj;
- });
- // reformattedArray is now [{1:10}, {2:20}, {3:30}],
- // kvArray is still [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}]
6.2 字符串使用map方法进行遍历
- var str="aabccd";
- var obj={};
- [].map.call(str,function(x,y,z){
- if(!obj[x]){
- obj[x]=1
- }else{
- obj[x]+=1
- }
- });
- //直接使用字符串的遍历器接口 ES6
- for (let x of str) {console.log(x)}
- // obj is {a: 2, b: 1, c: 2, d: 1}
6.3 反转字符串
- var str = '12345';
- var reverseStr = Array.prototype.map.call(str, function(x) {
- return x;
- }).reverse().join('');
- // reverseStr is '54321'
6.4 遍历dom元素节点
- var elems = document.querySelectorAll("div");
- var classNames = Array.prototype.map.call(elems, function(obj) {
- return obj.className;
- });
- console.log("获取页面中所有div元素使用的class",classNames);
7 兼容旧浏览器
在那些没有原生支持 map
方法的浏览器中,你可以使用下面的 Javascript 代码来实现它。
- if (!Array.prototype.map) {
- Array.prototype.map = function(callback, thisArg) {
- var T, A, k;
- if (this == null) {
- throw new TypeError(" this is null or not defined");
- }
- // 1. 将O赋值为调用map方法的数组.
- var O = Object(this);
- // 2.将len赋值为数组O的长度.
- var len = O.length >>> 0;
- // 3.如果callback不是函数,则抛出TypeError异常.
- if (Object.prototype.toString.call(callback) != "[object Function]") {
- throw new TypeError(callback + " is not a function");
- }
- // 4. 如果参数thisArg有值,则将T赋值为thisArg;否则T为undefined.
- if (thisArg) {
- T = thisArg;
- }
- // 5. 创建新数组A,长度为原数组O长度len
- A = new Array(len);
- // 6. 将k赋值为0
- k = 0;
- // 7. 当 k < len 时,执行循环.
- while(k < len) {
- var kValue, mappedValue;
- //遍历O,k为原数组索引
- if (k in O) {
- //kValue为索引k对应的值.
- kValue = O[ k ];
- // 执行callback,this指向T,参数有三个.分别是kValue:值,k:索引,O:原数组.
- mappedValue = callback.call(T, kValue, k, O);
- // 返回值添加到新数组A中.
- A[ k ] = mappedValue;
- }
- // k自增1
- k++;
- }
- // 8. 返回新数组A
- return A;
- };
- }
Array.prototype.map()方法详解的更多相关文章
- Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解
Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...
- JavaScript中Array.prototype.sort()的详解
摘抄来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort sor ...
- Array.prototype.slice用法详解
slice方法是定义在js数组原型中的方法,用于截取数组的部分元素,具体使用如下: arrayExample.slice(start, end); start为起始元素位置,end为截止元素位置,如: ...
- JavaScript中数组Array.sort()排序方法详解
JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...
- JavaScript中数组Array方法详解
ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...
- Array.prototype.map()详解
今天在地铁上看到这样一个小例子: ["1","2","3"].map(parseInt); 相信很多人和我一样,觉得输出的结果是[1,2,3 ...
- Javascript中Array.prototype.map()详解
map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋 ...
- 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)
ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器. ...
- JS Array常用方法indexOf/filter/forEach/map/reduce详解
Array共有九个方法 Array.prototype.indexOf Array.prototype.lastIndexOf Array.prototype.every Array.protot ...
随机推荐
- Android开发——蓝牙
---恢复内容开始--- 前言 孤芳自赏,一揽芳华: 人情冷暖,自在人心: 登高远眺,望步止前: 喜笑言开,欺人骗己. 上篇文章介绍了基本的蓝牙使用,书写的demo也不是很完善,希望各位大神能够改正. ...
- 读取.properties配置信息
package com.ctcti.webcallcenter.utils; import java.io.FileInputStream;import java.io.FileNotFoundExc ...
- python_函数的可变参数
def test(*args,**kwargs): print(args) print(kwargs) test(1,2,3,x=1,y=2) 运行结果: *args称为positional argu ...
- fedora安装gcc
查看gcc版本 gcc --version 命令行编译 g++ -std=c++11 -o main main.cpp 查看程序是否编译成功 echo $? 返回0表示编译成功 新版的Fedora(2 ...
- jQuery 点击 星星评分
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 输出所有进程和进程ID
#include <windows.h> #include <tlhelp32.h> #include <tchar.h> #include <stdio.h ...
- 手动配置webpack
//注:“__dirname”是node.js中的一个全局变量,它指向当前执行脚本所在的目录.const path = require('path');const webpack = require( ...
- 二维码之zxing仿新浪微博二维码
在前言中最后部分,提到了二维码开发工具资源ZXing.网上有它最新1.7版的源码,感兴趣的可以下载下来看看,要打包生成core比较麻烦,网上有相关教程.嫌麻烦的朋友,可以去我的资源里下载Java版的c ...
- Unexpected token d in JSON at position 669 while parsing near '...ct-mode":"^6.0.2"}
问题 在安装 babel 的时候,遇到问题 Unexpected token d in JSON at position 669 while parsing near '...ct-mode" ...
- 杀了个回马枪,还是说说position:sticky吧
<style> article { max-width: 600px; margin: 1em auto; } article h4, article footer { position: ...