Table of Content

7.1 Set

是一个无重复值的有序列表.允许对它包含的数据进行快速的访问.增加了一个追踪离散值的方式.

7.1.1 创建set并添加项目.

let set = new Set();
set.add(1)
set.add('1')
console.log(set.size)

以上使用了add()方法向set中添加了项目.可以通过size属性能查看有多少项.

Set不会使用强制类型的转换来判断当前值是否重复.允许存在不同类型的相同值,但是有一个例外 0

-0 和 +0 被认为是一样的

let set = new Set();
set.add(1)
set.add(-1)
set.add(0)
set.add(-0)
set.add(+0)
set.add('1')
console.log(set.size)  //4

也可以添加多个对象,但是多个对象并不会认为是一同一项

let set = new Set(),
    a = {},
    b = {};

    set.add(a)
    set.add(b)
    console.log(set.size)  //2

如果add()方法对相同的值进行多次调用,会在第一次之后被忽略;

let set = new Set();
set.add(1)
set.add('1')
set.add(1)
set.add(1)
console.log(set.size)  //2

当然也可以用数组来初始化Set,且Set会确保不重复的使用这些值.比如:

let set = new Set([1,2,3,4,3,4,3,1,4,6,3]);
console.log(set.size) // 5

在以上这个例子中,数组中的重复值被去除了.虽然当中的数字很多都出现多次.但是只会存一个.

可以使has()方法来判断一个值是否存于Set中,比如:

console.log(set.has(19))  //false

7.1.2 移除值

想要把Set中的值移除.可以使用 delete() 方法来实现,或着也可以用调用clear()方法来把所有的值从Set中移除

比如:

let set = new Set([1,2,3,4,3,4,3,1,4,6,3]);
console.log(set.size) // 5
console.log(set.has(6))  //false
console.log(set.has(19))  //false
set.delete(6)  //删除
console.log(set.has(6))  //false
set.clear() //清除所有
console.log(set.has(1))  //false
console.log(set.size) // 0

所有的这些方法都都有提供一个机制追踪唯一值,不过,在给Set添加之后,如果想要对每个项执行 一些操作,需要用到forEach()方法.

7.1.3 set.forEach()方法

这个的是属于Set上的forEach()方法,在之前的forEach方法,可以更容易处理数组中的数组.不用建立循环.于是在Set类型也加了相同的方法.工作方式是一样的.

接受三个参数,

  1. Set中下个位置的值
  2. 和第一个参数相同的值
  3. Set本身

set中forEach和数组中的版本有一点点差别.set版本传给回调函数的第一个和第二个是相同的...Set没有所谓的健.具体的使用方法.

let set = new Set([1,2]);

set.forEach(function(value,key,selfSet){
     console.log(value,key)
     console.log(selfSet === set)
})
//结果
1 1
true
2 2
true

以上代码在每一项中进行了迭代,并对传递给forEach(),回调函数的值进行了输出.回调函数每次执特时.key和value总是相同的,同时selfSet和set 也是相同的.

 7.1.4 把Set转换为数组

可以使用剩余参数把set赋值给一个新的数组变量.

let set = new Set([1,2,4,5,3,3,5,6,3])
let arr = [...set];

console.log(arr)  //[1, 2, 4, 5, 3, 6]

以上代码中,set在初始化的时候包含了一个有重复值的数组.在清除重复值之后.又使用了扩展运算符把自己的项放到了一个新的数组中.这一步只是把这数组中的每一个项复制给了新数组.本身依旧存在.

7.2 Map

Map类型是键值对的有序列表.健和值可以是任意的类型.

可以使用map.set()方法传递一个健和一个值,来添加项.

可以用键名来调用map.get()方法来取得对应的值

let map = new Map();
map.set('name','朱鹏富');
console.log(map.get('name'))

以上案例存用name为键,朱鹏富为值.接着使用get()方法取得对应的值.如果不存在.就是undefined;

也可以使用对象来创建键.在这之前是不可能做到的.

let map = new Map();
let key1 = {},key2 = {};
map.set(key1,100);
map.set(key2,200)
console.log(map.get(key1))
console.log(map.get(key2))

以上用了对象作为map的键.并了两个值,因为这些健不会被转换为其它形式,每个对象又是唯一所以就允许我们关联额外数据.不用去修改对象自己本身.

7.2.1 Map的方法

Map和Set共享了几个方法.允许我们使用相似的方法来进行map和set的交互.

  1. has() 判断指定的键是否存在
  2. delete() 删除map中的健以及对应的值
  3. clear() 删除所有的map中的健与值
  4. 同样有一个size属性.用于指定有多少个的键值对.

示例:

let map = new Map();
map.set('name','朱鹏富');
map.set('age','18');

console.log(map.size)  //2

console.log(map.has('age'))  //true
console.log(map.get('age'))  //18

map.delete('name');
console.log(map.has('name'))  //false
console.log(map.get('name'))  //undefiend
console.log(map.size)  //1

map.clear();
console.log(map.has('name'))  //false
console.log(map.get('name'))  //undefiend
console.log(map.has('age'))  //false
console.log(map.get('age'))  //undefiend
console.log(map.size)  //0

size属性包含了map中的键值对的数量.分别演示各方法的结果.

 7.2.2 Map的初始化

和Set一样,可以把数组给Map,比如:

let map = new Map([['name','朱澳'],['age','18']]);

console.log(map.has('name'))   //true
console.log(map.get('name'))   //朱澳
console.log(map.has('age'))    //朱澳
console.log(map.get('age'))    //18
console.log(map.size)   //2

以上代码通过Map构造器进行了初始化.name.age添加到了map的变 量中.由数组的形式构成.允许键是任意类型.使用数组是确保它们在添加到map之前不会被强制转为其它类型的唯一方法

7.2.3 Map.forEach()方法

方法类似于set和数组中的同名方法,接受一个回调函数.回调函数接受三个参数:

  1. map下位置的值
  2. 这个值对应的健
  3. Map本身自己

回调函数的这些参数和数组中的forEach方法的行为基本上契合的.也就是第一个在数是值,第二个参数是健

在数组中是索引值.比如:

let map = new Map([['name','朱棣'],['age','18']]);
map.forEach(function(value,key,self){
    console.log(value,key,self)
})

forEach回调函数传递了具体的每个参数的详细信息.

Leave a Reply

Your email address will not be published.