set&map

set

  • 类似于数组,但是成员的值都是唯一的,没有重复的值。
  • Set 函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。
1
2
3
4
5
6
7
8
var s = new Set();

[2, 3, 5, 4, 5, 2, 2].map(x => s.add(x));
for (let i of s) {
console.log(i); // 2 3 4 5
}

console.log(s) {2, 3, 4, 5}

数组去重

1
2
3
4
let arr = [1, 3, 4, 4, 3]
const set = new Set(arr);
let newArr = [...set]
console.log(newArr)

set内部区分相同

NaN 任务相同,2 和 ‘2’不同,也就是说不会隐式转换。

1
2
3
let aa = new Set([1, 2, '2', NaN, NaN])
console.log(aa)
// Set(4) {1, 2, "2", NaN}

set 方法

  • add(value):添加某个值,返回 Set 结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。
1
2
3
4
5
6
7
8
9
10
11
let s = new Set()
s.add(1).add(2);
// 注意2被加入了两次
console.log(s)
s.size // 2

s.has(1) // true
s.has(3) // false

s.delete(2);
s.has(2) // false

转化为数组

1
2
const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);

Map 数据,Map 结构提供了“值—值”的对应

对象本质是键值对集合(Hash结构),对象只能用字符串当键,存在限制

Map 数据方法

m.set(a, ‘3’)
m.get(a)
m.has(a)
m.delete(a)
m.clear()

适用引用类型做键值

1
2
3
4
5
6
const mapA = new Map();
let o = {a: 2}
mapA.set(o, 5)
o.a = 7
console.log(o)
console.log(mapA.get(o)) // 5

只有对同一个对象的引用,Map 结构才将其视为同一个键。这一点要非常小心。看下面代码

1
2
3
4
5
6
7
8
const map = new Map();
let b = ['33333']

map.set(['a'], 555);
map.set(b, 333)

console.log(map.get(['a'])) // undefined
console.log(map.get(b)) // 333

同样的值两个示例,在Map中视为两个键

1
2
3
4
5
6
7
8
9
10
11
const map = new Map();

const k1 = ['a'];
const k2 = ['a'];

map
.set(k1, 111)
.set(k2, 222);

map.get(k1) // 111
map.get(k2) // 222

Map() 针对二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const map = new Map([
['name', '张三'],
['title', 'Author']
]);

map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

等价于

const items = [
['name', '张三'],
['title', 'Author']
];

const map = new Map();

items.forEach(
([key, value]) => map.set(key, value)
);

Map() 键多次赋值,后面覆盖前面

1
2
3
4
5
6
7
const map = new Map();

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

map.get(1) // "bbb"

Map() 转化为数组

1
2
3
4
5
const myMap = new Map()
.set(true, 7)
.set({foo: 3}, ['abc']);
[...myMap]
// [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]

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

1
2
3
4
5
6
7
8
let ma = new Map()
ma.set('yes', true)
ma.set('no', false)
let obj = Object.create(null)
for (let [key, val] of ma) {
obj[key] = val
}
console.log(obj)
返回
顶部