array.map(function(currentValue,index,arr),thisValue)
参数:
- currentValue:【必填】数组中正在处理的当前元素。
- index:【可选】数组中正在处理的当前元素的索引。
- arr:【可选】方法被调用的数组。也就是当前元素属于的原数组对象。
- thisValue:【可选】执行回调函数时使用的this值。
这里的map是“映射”的意思,map方法将数组的所有成员依次传入参数函数,然后把每一次的执行后的返回值(包括 undefined
)组成一个新数组返回。
特征:
- map()是一个复制迭代方法,它不改变原数组,而是按照原始数组元素顺序依次处理元素,最终会返回新数组。
- 如果map函数中没有返回值,将会默认返回
undefined
。 - 使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。
- map() 不会对空数组进行检测。
- callbackFn 仅在已分配值的数组索引处被调用。它不会在稀疏数组中的空槽处被调用。
- 无法中断循环,return 只是结束本地循环,进入下一次循环,break 或 continue 都将会报错。
//特征 1,2 var numbers1 = [1, 2, 3]; var numbers2 = numbers1.map(function (currentValue, index, arr) { return currentValue+ 1; }); var numbers3 = numbers1.map(function (currentValue, index, arr) { }); console.log(numbers1);//>[2, 3, 4]---不会改变原数组 console.log(numbers2);//> [1, 2, 3]---返回新数组 console.log(numbers3);//> [undefined, undefined, undefined]
使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中,原数组中新增元素、更新元素、删除元素,都将不会被 callback 访问到:
//特征 3 var numbers1 = [1, 2, 3]; var numbers2 = numbers1.map(function (currentValue, index, arr) { return currentValue; }); numbers1.push("4") console.log(numbers1);//>[1, 2, 3, "4"] console.log(numbers2);//> [1, 2, 3] var numbers3 = numbers1.map(function (currentValue, index, arr) { return currentValue; }); numbers1[2] = 6; console.log(numbers1);//> [1, 2, 6, "4"] console.log(numbers3);//> [1, 2, 3, "4"] var numbers4 = numbers1.map(function (currentValue, index, arr) { return currentValue; }); numbers1.pop(1) console.log(numbers1);//> [1, 2, 6] console.log(numbers4);//> [1, 2, 6, "4"] var numbers5 = numbers1.map(function (currentValue, index, arr) { return currentValue; }); delete numbers1[0] console.log(numbers1);//> [undefined, 2, 6] console.log(numbers5);//> [1, 2, 6]
火狐浏览器测试打印如下:
//特征 5
var array = [undefined, undefined, undefined];
console.log(array.map(x => 'x')); //>["x", "x", "x"]
var array = [,,,];
console.log(array.map(x => 'x')); //>[undefined, undefined, undefined]
//即使我们有一个混合了空槽和实际值的数组,也只有后者被映射
var array = [,'a',,'b',];
console.log(array.map(x => 'x')); //>[undefined, "x", undefined, "x"]
如果
thisArg
参数有值,则每次 callback
函数被调用的时候,this
都会指向 thisArg
参数上的这个对象。如果省略了 thisArg ``参数,``或者赋值为 null
或 undefined
,则 this 指向全局对象 。使用示例
ex1: 求数组中每个元素的平方根
const numbers = [1, 4, 9];
const roots = numbers.map((num) => Math.sqrt(num));
// roots 现在是 [1, 2, 3]
// numbers 依旧是 [1, 4, 9]
ex2: 使用 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会很方便。
js 如何中断 forEach、map 循环
https://www.49855.net/js-interrupt-foreach-map-loop
参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map