ES6的新特性之函数的扩展 Set 和 Map 数据结构

385 阅读3分钟

Set

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

Set本身是一个构造函数,用来生成 Set 数据结构。

Set 实例的属性和方法

Set 结构的实例有以下属性。

  • Set.prototype.constructor:构造函数,默认就是Set函数。
  • Set.prototype.size:返回Set实例的成员总数。

Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。

  • Set.prototype.add(value):添加某个值,返回 Set 结构本身。
  • Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
  • Set.prototype.clear():清除所有成员,没有返回值。
let set = new Set();

set.add("abc");
set.add("abc");

上面代码通过add()方法向 Set 结构加入成员,结果表明 Set 结构不会添加重复的值。

遍历操作

Set 结构的实例有四个遍历方法,可以用于遍历成员。

  • Set.prototype.keys():返回键名的遍历器
  • Set.prototype.values():返回键值的遍历器
  • Set.prototype.entries():返回键值对的遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员
let set = new Set(['aaa', 'bbb']);

for (let item of set.keys()) {
  console.log(item);
}
//aaa
//bbb

遍历的应用 扩展运算符(...)和 Set 结构相结合,就可以去除数组的重复成员。

let arr = [1, 2, 2, 3, 5, 5];
let unique = [...new Set(arr)];
// [1, 2, 3,5]

Map

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。map类似对象的类型 key支持任意类型。

let a = {"name":"张三"};
const myMap = new Map();
myMap.set(a,"死刑");
console.log(strMapToObj(myMap));
//{ '[object Object]': '死刑' }

实例的属性和操作方法

  • size属性返回 Map 结构的成员总数。
  • set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
  • get方法读取key对应的键值,如果找不到key,返回undefined
  • has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
  • delete方法删除某个键,返回true。如果删除失败,返回false
  • clear方法清除所有成员,没有返回值。
const myMap = new Map()
    .set('yes', true)
    .set('no', false);
console.log(strMapToObj(myMap));
// { yes: true, no: false }

遍历方法

Map 结构原生提供三个遍历器生成函数和一个遍历方法。

  • Map.prototype.keys():返回键名的遍历器。
  • Map.prototype.values():返回键值的遍历器。
  • Map.prototype.entries():返回所有成员的遍历器。
  • Map.prototype.forEach():遍历 Map 的所有成员。
let a = {"name":"张三"};
const myMap = new Map();
myMap.set(a,"死刑");
for (let key of myMap.keys()) {
    console.log(key);
    //{ name: '张三' }
}

Map 转为数组 Map 转为数组最方便的方法,就是使用扩展运算符(...)。

let a = {"name":"张三"};
const myMap = new Map();
myMap.set(a,"死刑");
console.log([...myMap]);

Map 转为对象 如果所有 Map 的键都是字符串,它可以无损地转为对象。

function strMapToObj(strMap) {
  let obj = {};
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

const myMap = new Map()
  .set('yes', true)
  .set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }

如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。