js数组高阶函数——map()方法

简介: js数组高阶函数——map()方法

😊博主:小猫娃来啦

😊文章核心:js数组高阶函数——map()方法

文章目录

map()语法

⭐map() 方法是数组原型的一个函数,该函数用于对数组中的每个元素进行处理,将其转换为另一个值,最终返回一个新的数组,该数组包含了经过处理后的每个元素。

以下是 map() 方法的基本语法:

array.map(callback(currentValue[, index[, array]])[, thisArg])

其中:


callback :表示对数组中的每个元素要执行的函数。该函数包含三个参数:


currentValue:表示正在处理的当前元素。

index:可选参数,表示正在处理的当前元素的索引。

array:可选参数,表示正在处理的当前数组。

thisArg:可选参数,表示执行 callback 函数时的 this 值。

map()的基本使用

⭐使用 map() 方法将数组中的数字乘以 2 并返回新的数组:

let numbers = [1, 2, 3, 4];
let doubled = numbers.map(function(num) {
    return num * 2;
});
console.log(doubled); // 输出 [2, 4, 6, 8]

首先我们定义了一个名为 numbers 的数组,其中包含四个数字。我们使用 map() 方法对该数组中的每个元素执行了一次函数,该函数将每个数字乘以 2 并返回新的数组 doubled


⭐将字符串数组转换为数字数组:

let strings = ['1', '2', '3'];
let numbers = strings.map(function(str) {
    return parseInt(str, 10);
});
console.log(numbers); // 输出 [1, 2, 3]

我们声明了一个名为 strings 的数组。我们使用 map() 方法对该数组中的每个元素使用了一次函数,该函数将每个字符串转换为数字并返回新的数组 numbers


⭐将对象数组转换为属性值数组:

let objects = [{ name: 'apple', color: 'red' }, { name: 'banana', color: 'yellow' }, { name: 'orange', color: 'orange' }];
let colors = objects.map(function(obj) {
    return obj.color;
});
console.log(colors); // 输出 ["red", "yellow", "orange"]

⭐将一个数组中的对象转换为另一个数组,只保留对象中的某些属性:

const users = [
  {name: 'Alice', age: 25},
  {name: 'Bob', age: 30},
  {name: 'Charlie', age: 35},
];
const names = users.map(function(user) {
  return user.name;
});
console.log(names); // ['Alice', 'Bob', 'Charlie']

⭐将一个数组中的字符串转换为另一个数组,只保留长度大于等于5的字符串:

const words = ['apple', 'banana', 'cherry', 'date', 'elderberry'];
const longWords = words.map(function(word) {
  if (word.length >= 5) {
    return word;
  }
});
console.log(longWords); // ['apple', 'banana', 'cherry', undefined, 'elderberry']

⭐⭐⭐需要注意的是,在使用 map() 方法时,我们可以选择传递可选参数 thisArg 来设置回调函数的 this 值。如果不传递 thisArg 参数,则默认情况下,回调函数的 this 值为undefined

举个例子:

let numbers = [1, 2, 3];
let obj = { multiplier: 2 };
let doubled = numbers.map(function(num) {
    return num * this.multiplier;
}, obj);
console.log(doubled); // 输出 [2, 4, 6]

上面的例子中,我们定义了一个名为 numbers 的数组,其中包含三个数字。我们还定义了一个名为 obj 的对象,其中包含一个名为 multiplier 的属性,该属性的值为 2。我们在回调函数中使用 this.multiplier,其中 this 值为 obj,来将数组中的每个元素乘以 2。

map()的优缺点

优点:


map()默认会有返回值,一般返回一个数组。这里要强调一下,函数默认没有返回值。如果函数内部没有明确使用return语句返回一个值,那么该函数执行完毕后会自动返回undefined。所以这个也是map()的一个特色

可以方便地对数组中的每个元素进行操作,并生成一个新的数组;

不会改变原始数组。

缺点:


无法使用break,continue,return等关键字控制循环,必须全部遍历完毕才能停止;

对于大型数据集合而言,可能会导致性能问题。

数据小的时候,用map()循环非常的爽,不是很消耗性能。但数据大的情况下,用map()会很耗性能,因为map()会对数组中的每个元素执行一次callback方法。建议数据大的时候,用for循环。虽然多次for循环嵌套看着恶心,但是性能好,是底层的东西。而所谓的map(),set(),for in,for of 都是在for循环的基础上再封装。单从性能角度考虑,远不如for循环优秀。

map()的使用场景

  • 将一组数据转换为另一种形式或格式;
  • 对一组数据进行过滤、去重等操作;
  • 对一组DOM元素进行修改等操作;

去重

一般情况下,去重一个数组,有这么几种方法。

双重for循环配合splie去重

//先定义一个数组
var arr=[1,2,2,3,4,4,5]
//双重for循环
for(i = 0;i < arr.length; i++){
  for(j = i+1;j < arr.length; j++){ 
//如果数组中有两个数相等,这里用三位运算符
    if(arr[i] === arr[j]){ 
//在第j个元素开始删除,删除1个元素。splice方法,还可以对多个对象中的某个或某几个对象删除
      arr.splice(j,1);
      j--;
    }
  }
}
console.log(arr)

map循环配合Array.from去重

const arr = [1, 2, 2, 3, 4, 4, 5];
const newArr = Array.from(new Map(arr.map(item => [item, item])).values());
console.log(newArr); // [1, 2, 3, 4, 5]

这段代码的原理是,先使用map方法将数组元素映射为键值对的数组。然后使用Map构造函数将键值对数组转换为Map对象,其中键和值均为数组的元素。由于Map对象中键是唯一的,这样就自动去除了数组中的重复项。最后,通过Array.from()方法将去重后的Map对象的值转换为新的数组。


set()去重

以下是使用Set数据结构进行数组去重的例子:

let arr = [1, 2, 2, 3, 4, 4, 5];
let newArr = [...new Set(arr)];
console.log(newArr);  // [1, 2, 3, 4, 5]

这里使用了ES6中的Set数据结构来创建一个去重后的新数组newArr

filter()去重

let arr = [1, 2, 2, 3, 4, 4, 5];
let newArr = arr.filter((value, index, self) => {
  return self.indexOf(value) === index;
});
console.log(newArr);  // [1, 2, 3, 4, 5]

filter()函数遍历数组中的每个元素,并通过比较当前元素在数组中的索引位置来判断是否保留。只有第一次出现的元素会被保留下来,从而实现了去重的效果

相关文章
|
29天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
27天前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
122 52
|
1月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
1月前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
1月前
|
存储
`map()`方法在什么场景下会比 `forEach()`方法更高效?
综上所述,当需要对数组元素进行复杂的转换并生成新数组、进行链式调用和函数式编程、处理元素之间存在明确映射关系的情况以及与其他数组方法结合使用时,`map()`方法比`forEach()`方法更高效,能够使代码更加简洁、清晰和易于维护。
57 32
|
28天前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
41 5
|
1月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
26 1
|
1月前
|
存储 JavaScript 前端开发
如何选择使用`map()`方法和`forEach()`方法?
选择使用`map()`方法还是`forEach()`方法主要取决于操作的目的、是否需要返回值、代码的可读性和维护性等因素。在实际开发中,需要根据具体的业务需求和场景来灵活选择合适的方法,以实现更高效、更易读和更易维护的代码。
26 3
|
1月前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
41 7