js map()

作者admin

9月 7, 2023

array.map(function(currentValue,index,arr),thisValue)

参数:

  • currentValue:【必填】数组中正在处理的当前元素。
  • index:【可选】数组中正在处理的当前元素的索引。
  • arr:【可选】方法被调用的数组。也就是当前元素属于的原数组对象。
  • thisValue:【可选】执行回调函数时使用的this值。

这里的map是“映射”的意思,map方法将数组的所有成员依次传入参数函数,然后把每一次的执行后的返回值(包括 undefined)组成一个新数组返回。

特征:

  1.  map()是一个复制迭代方法,它不改变原数组,而是按照原始数组元素顺序依次处理元素,最终会返回新数组。
  2. 如果map函数中没有返回值,将会默认返回undefined
  3. 使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。
  4. map() 不会对空数组进行检测。
  5. callbackFn 仅在已分配值的数组索引处被调用。它不会在稀疏数组中的空槽处被调用。
  6. 无法中断循环,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);//> Array(3)[2, 3, 4]---不会改变原数组
console.log(numbers2);//> Array(3)[1, 2, 3]---返回新数组
console.log(numbers3);//> Array(3)[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);//> Array(4)[1, 2, 3, "4"] 
console.log(numbers2);//> Array(3)[1, 2, 3] 

var numbers3 = numbers1.map(function (currentValue, index, arr) { 
return currentValue;
}); 
numbers1[2] = 6;
console.log(numbers1);//> Array(4)[1, 2, 6, "4"]
console.log(numbers3);//> Array(4)[1, 2, 3, "4"]

var numbers4 = numbers1.map(function (currentValue, index, arr) { 
return currentValue;
});
numbers1.pop(1)
console.log(numbers1);//> Array(3)[1, 2, 6]
console.log(numbers4);//> Array(4)[1, 2, 6, "4"]

var numbers5 = numbers1.map(function (currentValue, index, arr) { 
return currentValue;
});
delete numbers1[0]
console.log(numbers1);//> Array(3)[undefined, 2, 6]
console.log(numbers5);//> Array(3)[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 ``参数,``或者赋值为 nullundefined,则 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

作者 admin

百度广告效果展示