1,set
基本用法
ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set趣苏。它類似于數(shù)組狡相,但是成員的值都是唯一的,沒有重復(fù)的值食磕。
Set 本身是一個(gè)構(gòu)造函數(shù),用來生成 Set 數(shù)據(jù)結(jié)構(gòu)彬伦。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);
}
// 2 3 5 4
上面代碼通過add方法向 Set 結(jié)構(gòu)加入成員滔悉,結(jié)果表明 Set 結(jié)構(gòu)不會(huì)添加重復(fù)的值。
實(shí)現(xiàn)數(shù)組去重
// 去除數(shù)組的重復(fù)成員
[...new Set(array)]
Set 實(shí)例的屬性和方法 § ?
Set 結(jié)構(gòu)的實(shí)例有以下屬性单绑。
- Set.prototype.constructor:構(gòu)造函數(shù)回官,默認(rèn)就是Set函數(shù)。
-
Set.prototype.size:返回Set實(shí)例的成員總數(shù)询张。
Set 實(shí)例的方法分為兩大類:操作方法(用于操作數(shù)據(jù))和遍歷方法(用于遍歷成員)孙乖。下面先介紹四個(gè)操作方法。 - add(value):添加某個(gè)值份氧,返回 Set 結(jié)構(gòu)本身唯袄。
- delete(value):刪除某個(gè)值,返回一個(gè)布爾值蜗帜,表示刪除是否成功恋拷。
- has(value):返回一個(gè)布爾值,表示該值是否為Set的成員厅缺。
- clear():清除所有成員蔬顾,沒有返回值宴偿。
Array.from方法 可以將 Set 結(jié)構(gòu)轉(zhuǎn)為數(shù)組。
const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);
這就提供了去除數(shù)組重復(fù)成員的另一種方法诀豁。
function dedupe(array) {
return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
遍歷操作
Set 結(jié)構(gòu)的實(shí)例有四個(gè)遍歷方法窄刘,可以用于遍歷成員。
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對的遍歷器
forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員
2舷胜,Map
含義和基本用法
JavaScript 的對象(Object)娩践,本質(zhì)上是鍵值對的集合(Hash 結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當(dāng)作鍵烹骨。這給它的使用帶來了很大的限制翻伺。
也就是說object的鍵名只能是字符串,而Map的鍵名可以為任意類型
Map的屬性和操作方法
Map 結(jié)構(gòu)的實(shí)例有以下屬性和操作方法沮焕。
(1)size 屬性
size屬性返回 Map 結(jié)構(gòu)的成員總數(shù)吨岭。
const map = new Map();
map.set('foo', true);
map.set('bar', false);
map.size // 2
(2)set(key, value)
set方法設(shè)置鍵名key對應(yīng)的鍵值為value,然后返回整個(gè) Map 結(jié)構(gòu)峦树。如果key已經(jīng)有值辣辫,則鍵值會(huì)被更新,否則就新生成該鍵空入。
const m = new Map();
m.set('edition', 6) // 鍵是字符串
m.set(262, 'standard') // 鍵是數(shù)值
m.set(undefined, 'nah') // 鍵是 undefined
(3)get(key)
get方法讀取key對應(yīng)的鍵值络它,如果找不到key,返回undefined歪赢。
const m = new Map();
const hello = function() {console.log('hello');};
m.set(hello, 'Hello ES6!') // 鍵是函數(shù)
m.get(hello) // Hello ES6!
(4)has(key)
has方法返回一個(gè)布爾值化戳,表示某個(gè)鍵是否在當(dāng)前 Map 對象之中。
const m = new Map();
m.set('edition', 6);
m.set(262, 'standard');
m.set(undefined, 'nah');
m.has('edition') // true
m.has('years') // false
m.has(262) // true
m.has(undefined) // true
(5)delete(key)
delete方法刪除某個(gè)鍵埋凯,返回true点楼。如果刪除失敗,返回false白对。
const m = new Map();
m.set(undefined, 'nah');
m.has(undefined) // true
m.delete(undefined)
m.has(undefined) // false
(6)clear()
clear方法清除所有成員掠廓,沒有返回值。
let map = new Map();
map.set('foo', true);
map.set('bar', false);
map.size // 2
map.clear()
map.size // 0
遍歷方法
Map 結(jié)構(gòu)原生提供三個(gè)遍歷器生成函數(shù)和一個(gè)遍歷方法甩恼。
keys():返回鍵名的遍歷器蟀瞧。
values():返回鍵值的遍歷器。
entries():返回所有成員的遍歷器条摸。
forEach():遍歷 Map 的所有成員悦污。
需要特別注意的是,Map 的遍歷順序就是插入順序钉蒲。
const map = new Map([
['F', 'no'],
['T', 'yes'],
]);
for (let key of map.keys()) {
console.log(key);
}
// "F"
// "T"
for (let value of map.values()) {
console.log(value);
}
// "no"
// "yes"
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
// 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"