JavaScript map()方法超全介绍

JavaScript map()方法超全介绍

文章目录

在 JavaScript 中, map() 是数组的一个常用方法,它创建一个新数组,其结果是该数组中的每个元素调用一次提供的函数后的返回值。

map() 的基本语法:

array.map(function(currentValue, index, array){// 返回新值}, thisValue);

一 、主要特点:

  1. 不会改变原数组,而是返回一个新数组
  2. 新数组的长度与原数组相同
  3. 对数组中的每个元素都执行一次回调函数

二、示例:

  1. 基本用法 - 将数字数组翻倍
const numbers =[1,2,3,4,5];const doubled = numbers.map(num=> num *2); console.log(doubled);// [2, 4, 6, 8, 10] console.log(numbers);// [1, 2, 3, 4, 5] (原数组不变)
  1. 处理对象数组
const users =[{name:'Alice',age:25},{name:'Bob',age:30},{name:'Charlie',age:35}];// 提取所有用户名const names = users.map(user=> user.name); console.log(names);// ["Alice", "Bob", "Charlie"]// 计算每个人5年后的年龄const agesInFiveYears = users.map(user=>({...user,age: user.age +5}));
  1. 转换数据格式
const numbers =[1,2,3];const numberStrings = numbers.map(num=>`Number: ${num}`); console.log(numberStrings);// ["Number: 1", "Number: 2", "Number: 3"]
  1. 使用索引参数
const fruits =['apple','banana','cherry'];const indexedFruits = fruits.map((fruit, index)=>`${index +1}. ${fruit}`); console.log(indexedFruits);// ["1. apple", "2. banana", "3. cherry"]

map() 是函数式编程中常用的方法,经常与 filter()reduce() 等数组方法配合使用,处理和转换数据。注意不要在 map() 中进行没有返回值的操作(如仅打印),这时候应该使用 forEach() 更合适。

三、map() 方法和 forEach() 方法有什么区别?

在 JavaScript 中,map()forEach() 都是用于遍历数组的方法,但它们的设计目的和使用场景有显著区别:

1. 返回值不同

forEach()没有返回值(返回 undefined),仅用于执行遍历操作。

const numbers =[1,2,3];const result = numbers.forEach(num=> num *2); console.log(result);// undefined

map():返回一个新数组,新数组的元素是原数组每个元素经过回调函数处理后的结果。

const numbers =[1,2,3];const doubled = numbers.map(num=> num *2); console.log(doubled);// [2, 4, 6](新数组)
2. 用途不同

forEach():适合执行副作用操作(如打印、修改外部变量、DOM操作等),不关心返回值时使用。

// 打印数组元素(副作用)const fruits =['apple','banana']; fruits.forEach(fruit=> console.log(fruit));

map():适合数据转换场景,需要根据原数组生成新数组时使用(如格式转换、值计算等)。

// 将对象数组转换为只包含名称的数组const users =[{name:'Alice'},{name:'Bob'}];const names = users.map(user=> user.name);// ['Alice', 'Bob']
3. 链式调用支持

forEach():由于返回 undefined,无法进行链式调用。

// 无效的链式调用(会报错) numbers.forEach(...).filter(...)// 错误:Cannot read property 'filter' of undefined

map():由于返回新数组,可以直接链式调用其他数组方法(如 filter()reduce() 等)。

const numbers =[1,2,3,4];const sumOfDoubledEvens = numbers .filter(num=> num %2===0)// 筛选偶数 [2, 4].map(num=> num *2)// 翻倍 [4, 8].reduce((sum, num)=> sum + num,0);// 求和 12
4. 中断遍历

两者都无法通过 breakcontinue 中断遍历(这一点与 for 循环不同)。
如果需要中断遍历,应使用 for 循环或 some()/every()(通过返回 true 提前退出)。

5. 总结
特性map()forEach()
返回值新数组(转换后的结果)无(undefined
用途数据转换生成新数组执行副作用操作
链式调用支持不支持
典型场景格式转换、值计算打印、DOM操作、修改外部变量

最佳实践

  • 当需要基于原数组生成新数组时,用 map()
  • 当仅需要遍历执行操作,不需要返回新数组时,用 forEach()

四、不使用map()方法的情况下实现类似的功能

如果不使用 map() 方法,我们可以通过其他方式实现类似的功能——即遍历数组并对每个元素进行处理,最终返回一个新的转换后数组。最常见的方式是使用 for 循环、for...of 循环或 forEach() 方法。

以下是几种实现方式:

1. 使用 for 循环(最基础的方式)
functioncustomMap(array, callback){// 创建一个新数组用于存储结果const result =[];// 遍历原数组for(let i =0; i < array.length; i++){// 对每个元素执行回调函数,并将结果存入新数组 result.push(callback(array[i], i, array));}// 返回转换后的新数组return result;}// 使用示例const numbers =[1,2,3,4];const doubled =customMap(numbers,(num)=> num *2); console.log(doubled);// [2, 4, 6, 8]const names =[{first:'John',last:'Doe'},{first:'Jane',last:'Smith'}];const fullNames =customMap(names,(person)=>`${person.first}${person.last}`); console.log(fullNames);// ["John Doe", "Jane Smith"]
2. 使用 for...of 循环(更简洁的遍历方式)
functioncustomMap(array, callback){const result =[];let index =0;// for...of 遍历元素,同时记录索引for(const item of array){ result.push(callback(item, index, array)); index++;}return result;}// 使用示例const fruits =['apple','banana','cherry'];const uppercaseFruits =customMap(fruits,(fruit)=> fruit.toUpperCase()); console.log(uppercaseFruits);// ["APPLE", "BANANA", "CHERRY"]
3. 使用 forEach() 方法

虽然 forEach() 本身没有返回值,但可以利用它遍历数组并收集结果:

functioncustomMap(array, callback){const result =[]; array.forEach((item, index, arr)=>{ result.push(callback(item, index, arr));});return result;}// 使用示例const numbers =[10,20,30];const withSuffix =customMap(numbers,(num)=>`${num}px`); console.log(withSuffix);// ["10px", "20px", "30px"]
4. 这些实现的核心思路:
  1. 创建一个空数组用于存储转换后的结果
  2. 遍历原数组的每个元素
  3. 对每个元素执行回调函数(接收当前元素、索引、原数组三个参数)
  4. 将回调函数的返回值存入结果数组
  5. 遍历结束后返回结果数组

这种自定义实现和原生 map() 方法的核心逻辑完全一致,只是原生方法经过了引擎优化,性能更好。通过这种方式,我们可以更深入理解 map() 的工作原理——它本质上就是一个"遍历-转换-收集"的过程。

Read more

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

大模型仍未对上商业的齿轮? 编译 | 王启隆 来源 | youtu.be/aWqfH0aSGKI 出品丨AI 科技大本营(ID:rgznai100) 现在的硅谷,空气里都飘着一股“再不上车就晚了”的焦躁感。 最近 OpenClaw 风头正旺,强势登顶 GitHub,终结了 React 神话,许多人更是觉得“AI 自己干活赚钱”的日子就在明天了。 特别是在斯坦福商学院(GSB)这种地方,台下坐着的都是成天琢磨怎么用下一个技术风口搞个独角兽出来的狠人。 微软的首席科学官(CSO)Eric Horvitz 被请到了这个几乎全美最想用 AI 变现的礼堂里。作为从上世纪 80 年代就开始搞 AI 的绝对老炮、也是微软技术底座的“扫地僧”,这位老哥并没有顺着台下的胃口,去吹捧下个月大模型又要颠覆什么行业,而是兜头给大家浇了一盆带点学术味的冷水。 他讲了一个挺有画面感的比喻:大家都在聊

By Ne0inhk
Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当大模型能在几秒钟内生成一段“看起来像那么回事”的补丁时,开源社区却开始付出另一种代价。 最近,开源游戏引擎 Godot 的核心维护团队公开吐槽:他们正被大量“AI 生成的低质量代码”淹没。那些代码往往结构完整、注释齐全、描述洋洋洒洒,但真正的问题是——提交者可能并不理解自己交上来的内容。 这件事,并不是简单的“有人偷懒用 AI 写代码”。它正在触及开源协作最核心的东西:信任。 一场悄无声息的“AI 洪水” 事情的导火索来自一条 Bluesky 讨论帖。 Godot 主要维护者之一、同时也是 Godot 商业支持公司 W4 Games 联合创始人的 Rémi Verschelde 表示,所谓的“AI slop”

By Ne0inhk
诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

当宇宙级的“嘴炮”遇到降维打击。 编译 | 王启隆 来源 | youtu.be/l6ZcFa8pybE 出品丨AI 科技大本营(ID:rgznai100) 打开最新一期知名播客 StarTalk 的 YouTube 评论区,最高赞的一条留言是这样写的: “我长这么大,第一次看到尼尔·德葛司·泰森(Neil deGrasse Tyson)在一档节目里几乎全程闭嘴,像个手足无措的小学生一样乖乖听讲。” 作为全美最知名的天体物理学家,泰森平时的画风是充满激情、喋喋不休、用宇宙的宏大来震撼嘉宾。但这一次,坐在他对面的那位满头银发、带着温和英音的英国老人,仅仅用最平淡的语气,就让整个演播室陷入了数次令人窒息的沉默。 这位老人是 Geoffrey Hinton。深度学习三巨头之一,2024 年诺贝尔物理学奖得主,被公认为“AI 教父”。 对经常阅读 Hinton 演讲的我来说,这也是比较新奇的一幕—

By Ne0inhk
48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 「仅过了 48 小时,一笔 8.2 万美元的天价费用凭空出现,较这家小型初创公司的正常月费暴涨近 46000%。」 这不是假设的虚幻故事,而是一家墨西哥初创公司正在经历的真实危机。 近日,一位名为 RatonVaquero 的开发者在 Reddit 发帖求助称,由于他的 Gemini API 密钥被盗用,原本每月仅约 180 美元(约 1242 元)的费用,在短短 48 小时内暴涨到 82,314.44 美元(约 56.8 万元)。对于这家只有三名开发者的小型创业团队来说,这笔突如其来的账单,几乎等同于灭顶之灾。 “我现在整个人都处在震惊和恐慌之中。”RatonVaquero

By Ne0inhk