Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
去重
function dedupe(array) {
return Array.from(new Set(array));
}
并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
Map
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
用Object做Object的键 [注意]
虽然上面说Object提供的是“字符串-值”的结构,但我们会发现
let data = {}
let obj = {}
obj[data] = 'data'
obj[1] = 1
console.log(obj[data]) // 'data'
console.log(obj[1]) //1
这里其实是把键给转成字符串了,并不是把对象或number当键,以下可验证
console.log(obj[{}]) // 'data'
console.log(obj[{key: 'key'}]) // 'data'
console.log(obj[data.toString()]) //'data'
console.log(obj["[object Object]"]) // 'data'
以上都能拿到obj[data] 的值,简单来说当用Object 或 number等非String的类型当成Object的键的时候,会自动把它转成字符串,取数据的时候类似。
console.log(1) // 1
console.log('1') // 1
Map用Object当作键
let map = new Map()
let a = {}
let b = {}
let c = {}
map.set(a, 'a')
map.set(b, 'b')
map.set(c, 'c')
map.set(1, 1)
map.set('1', '1')
console.log(map.get(a)) // "a"
console.log(map.get(b)) // "b"
console.log(map.get(c)) // "c"
console.log(map.get(1)) // 1
console.log(map.get("1")) // "1"