ES6中Set和Map数据结构

学习笔记 何锋
文章标签: ES6

一、Map数据类型

Map类型的出现是为了解决传统JavaScript对象中的键值对的键名只能是字符串,由此会带来一些不便。而Map数据类型类似于对象,也是键值对的集合,但键名可以是任何类型数据,包括Number,Object,Boolean等。

const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

在Map赋值时,若键名是Number,NaN(set时会认为NaN等于它本身)或Boolean,在多次赋同样键名的值会有替换效果。例如:

const map = new Map();
map

.set(1, 'aaa')
.set(1, 'bbb');

map.get(1) // "bbb"

Map数据结构同样有size属性,set(key,value),get(key),has(key),delete(key),clear()方法。 

可以通过它的keys(),values(),entries(),或实例(等同于entries)提供的Iterable接口用for/of遍历

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);
for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

for (let [key, value] of map) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

for (let item of map) {
  console.log(item);
}
// ["F", "no"]
// ["T", "yes"]

Map方法

var myMap = new Map();

myMap.set("bar", "baz");

myMap.set(1, "foo");
 
myMap.size;       // 2

myMap.has("bar"); // true

myMap.clear();

myMap.size;       // 0

myMap.has("bar")  // false

使用for...of方法迭代映射

  1. var myMap = new Map();
  2. myMap.set(0, "zero");
  3. myMap.set(1, "one");
  4. for (var [key, value] of myMap) {
  5. console.log(key + " = " + value);
  6. }
  7. // 将会显示两个log。一个是"0 = zero"另一个是"1 = one"
  8. for (var key of myMap.keys()) {
  9. console.log(key);
  10. }
  11. // 将会显示两个log。 一个是 "0" 另一个是 "1"
  12. for (var value of myMap.values()) {
  13. console.log(value);
  14. }
  15. // 将会显示两个log。 一个是 "zero" 另一个是 "one"
  16. for (var [key, value] of myMap.entries()) {
  17. console.log(key + " = " + value);
  18. }
  19. // 将会显示两个log。 一个是 "0 = zero" 另一个是 "1 = one"

二、Set数据类类型

Set类似于Array,但内部存储的数据不允许重复。该方法可接受具有Iterable接口的其他数据结构作为参数。

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

set对象方法:

let set = new Set(['red', 'green', 'blue']);

for (let item of set.keys()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.values()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

上面代码中,由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。entries不仅返回键值还返回键名。

forEach()方法,set结构的实例和数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值

set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9

上面代码说明,forEach方法的参数就是一个处理函数。该函数的参数与数组的forEach致,依次为键值、键名、集合本身(上例省略了该参数)。这里需要注意,Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。

另外,forEach方法还可以有第二个参数,表示绑定处理函数内部this对象。

还能输出{{restrictNumber}}个字符  
  • {{reply.author}}

    {{CommonUtil.formateDate(reply.ac_CommentDate).shortTime}}
  • 回复了{{Comments.author}} :