Set && Map

194 阅读2分钟

Set && Map

1. Set

ES6 提供的新的数据结构,一组 key 的集合,类似于数组。但成员的值都是唯一的。

要创建一个 Set,需要提供一个 Array作为输入,或者直接创建一个空 set。

let s1 = new Set()
console.log(Object.prototype.toString.call(s1))  // [object Set]

let s2 = new Set([1, 2, 3])
console.log(s2)             // Set(3) {1, 2, 3}
console.log([...s2])        // [1, 2, 3]

数组去重

let arr = ['a', 'b', 'c', 'c', 'b', null, null, NaN, NaN, {}]

console.log([...new Set(arr)]); // ["a", "b", "c", null, NaN, {…}]

字符串去重

let str = 'abbccddeffg'

console.log([...new Set(str)].join('')) // 'bcdefg'

Set 实例的属性和方法:

  • Set 结构的实例有以下属性:

    • Set.prototype.size: 返回 Set 实例的成员总数;
  • Set 实例的方法:

    • add(value): 添加某个值;
    • delete(value): 删除某个值;
    • has(value): 是否存在某个值,返回 布尔值;
    • clear(): 清空所有值;
console.log(s3.add('d')); // Set(4) {"a", "b", "c", "d"}

console.log(s3.delete('b')); // true

console.log(s3.has('b')); // false

console.log(s3.clear()); // 没有返回值

console.log(s3); // Set(0) {}

2. Map

Map 是一组键值对的集合(传统上只能用字符创当做键值),并且具有非常的查找速度

  • 初始化 Map 需要一个二位数组,或者是一个空 Map
let m1 = new Map([['aaa', 111], ['bbb', 222]])

console.log(m1); // Map(2) {"aaa" => 111, "bbb" => 222}

let m2 = new Map()

console.log(m2); // Map(0) {}
  • 当需要查找一个学生的成绩时,对于一个 [姓名,成绩]的表(姓名 => 成绩),只需要知道该学生的姓名,便可查到对应的成绩。查找速度极快。
let map = new Map([['tom', 98], ['lili', 90], ['Join', 80]])

console.log(map); // Map(3) {"tom" => 98, "lili" => 90, "Join" => 80}

console.log(map.get('tom')); // 98

console.log(map.has('Join')); // true
  • 一个 key 只能对应一个 value,当重复赋值时,将会产生覆盖。
let m3 = new Map([['aaa', 111], ['bbb', 222]])

m3.set('ccc', 333)
m3.set('ccc', 555)

console.log(m3); // Map(3) {"aaa" => 111, "bbb" => 222, "ccc" => 555}

console.log(m3.get('ccc')) // 555
  • Map 实例的遍历方法:

    • keys():
    • values():
    • entries():
    • forEach:
let m4 = new Map([['tom', 98], ['lili', 90], ['Join', 80]])

console.log(m4); // Map(3) {"tom" => 98, "lili" => 90, "Join" => 80}
console.log([...m4.keys()]) // ["tom", "lili", "Join"]
console.log([...m4.values()]) // [98, 90, 80]
console.log([...m4.entries()])
// 0:["tom", 98]
// 1:["lili", 90]
// 2:["Join", 80]

for(let key of m4.keys()) {
  console.log(key);  // tom, lili, Join
}

for(let value of m4.values()) {
  console.log(value);  // 98, 90, 80
}

for(let item of m4.entries()) {
  console.log(item);
  // ["tom", 98]
  // ['lili', 90]
  // ['Join', 80]

  console.log(item[0] + ' => ' + item[1]);
  // tom => 98
  // lili => 90
  // Join => 80
}

for(let [key, value] of m4.entries()) {
  console.log(key + ' => ' + value);
  // tom => 98
  // lili => 90
  // Join => 80
}

m4.forEach((value, key) => {
  console.log(key + ' => ' + value);
  // tom => 98
  // lili => 90
  // Join => 80
})