1、先看完整代码
bash
Array.from(new Map(arr.map(item => [item.code, item])).values())
先来看看 arr.map(...)
作用:把对象数组变成「键值对数组」
例如:[{code:'1',name:'2'},{code:'2',name:'3'}]
会变成
\['1', {code:'1',name:'2'}\], \['2', {code:'2',name:'3'}
]
Map 必须接收 [key, value] 格式,所以这一步是为 Map 做准备。
2、 new Map(...) 的作用
Map 是什么?
Map 是 JS 的键值对结构,key 唯一不重复。
1、自动去重
如果有重复 code,后面的会覆盖前面的,最终只保留最后一个。
2、存储结构
以 code 为 key,整个对象为 value
执行后得到一个 Map 结构:
bash
Map(2) {
'1' => { code: '1', name: '2' },
'2' => { code: '2', name: '3' }
}
3、.values() 的作用
bash
map.values()
作用:只把 Map 里的「值」取出来
得到一个 MapIterator 迭代器(不是数组,不能直接用):
bash
[Map Iterator] {
{ code: '1', name: '2' },
{ code: '2', name: '3' }
}
4、 Array.from(...) 的作用(核心)
Array.from(迭代器)
它的作用只有一句话:把「类数组 / 迭代器」转成真正的数组!
上面的 .values() 返回的是迭代器,不是数组,不能直接用。
Array.from 就是把它变成标准数组:
bash
[
{ code: '1', name: '2' },
{ code: '2', name: '3' }
]
5、Object.entries
一句话:Object.entries(对象) 会把一个对象,转成 [[key, value], [key, value], ...] 这样的二维数组。
Object.entries(对象)
→ 把对象变成 [[键, 值], [键, 值]] 的数组
new Map(二维数组)
→ 接收这种结构,生成一个 Map 做去重