js数组 map() 方法
概览
map() 是数组的转换方法:遍历每个元素并返回“新数组”。它不改变原数组,常用于格式化数据、提取字段、添加计算属性等。
语法
1 | const newArray = array.map((element, index, array) => { |
- element: 当前元素
- index: 当前索引(可选)
- array: 原数组(可选)
常见模式
基础转换(数字/字符串)
1
2
3
4const nums = [1, 2, 3]
const doubled = nums.map(n => n * 2) // [2, 4, 6]
const names = ['张三', '李四']
const hi = names.map(n => `你好, ${n}`) // ['你好, 张三', '你好, 李四']提取对象属性(单个/多个)
1
2
3const users = [{id:1, name:'张三', age:25}, {id:2, name:'李四', age:30}]
const onlyNames = users.map(u => u.name) // ['张三','李四']
const light = users.map(u => ({ name: u.name, age: u.age }))数组解构转对象(可跳过、可重命名)
1
2
3
4
5
6
7const rows = [
['张三', '2024-01-15', '男'],
['李四', '2024-02-20', '女']
]
const all = rows.map(([name, date, gender]) => ({ name, date, gender }))
const part = rows.map(([name, , gender]) => ({ name, gender }))
const renamed = rows.map(([n, , g]) => ({ studentName: n, studentGender: g }))复杂解构与类型转换 / 剩余参数
1
2
3
4
5const csv = [['产品A','100','50','北京'], ['产品B','200','30','上海']]
const products = csv.map(([name, price, , location]) => ({ name, price: Number(price), location }))
const data = [['张三',25,'工程师','Python','Go'], ['李四',30,'设计师','Figma']]
const employees = data.map(([name, age, role, ...skills]) => ({ name, age, role, skills }))添加/计算新属性(保留原属性)
1
2const items = [{ name:'A', price:100 }, { name:'B', price:200 }]
const withTax = items.map(p => ({ ...p, tax: p.price * 0.1, total: p.price * 1.1 }))使用索引(编号/生成 id)
1
2
3const fruits = ['苹果','香蕉','橙子']
const numbered = fruits.map((f, i) => `${i + 1}. ${f}`)
const withId = fruits.map((f, i) => ({ id: i, name: f }))
箭头函数要点
1 | // 简写:无花括号,隐式返回 |
重要特点
- 不改变原数组(纯函数)
- 返回新数组(长度与原数组相同)
- 回调需要返回值(否则得到由
undefined组成的数组) - 可链式调用:
array.map(...).filter(...).reduce(...)
对比其他数组方法
1 | const arr = [1, 2, 3, 4, 5] |
常用技巧
- 解构跳过元素:
[[1,2,3]].map(([a, , c]) => ({ a, c })) - 对象属性简写:
const obj = { name }等价{ name: name } - 展开运算符保留原属性:
arr.map(item => ({ ...item, extra: 1 })) - 链式处理:
arr.map(n => n*2).filter(n => n>5).map(n => ({ value: n }))
解构与简写的含义与作用
以 const mapped = rows.map(([name, , gender]) => ({ name, gender })) 为例:
[name, , gender]:数组解构,声明变量并从位置提取值(可理解为const name = row[0])。{ name, gender }:对象属性简写,等价{ name: name, gender: gender }。
等价写法对比
1 | // 1) 解构 + 简写 |
ES6 对象简写规则
当属性名与变量名相同,可写成简写:
1 | const name = '张三'; const age = 30 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 iehtian!
