2020-03-30-ES6溫習(xí)7

數(shù)據(jù)結(jié)構(gòu)

Map,Set和Array的對比

各種情況下對比

增刪改查

let map=new Map();

let array=[];

map.set('t',1);

array.push({t:1});

console.log('map-array',map,array);

Map

Map對象保存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。構(gòu)造函數(shù)Map可以接受一個數(shù)組作為參數(shù)。

Map和Object的區(qū)別

?一個Object 的鍵只能是字符串或者 Symbols,但一個Map 的鍵可以是任意值。

?Map中的鍵值是有序的(FIFO 原則),而添加到對象中的鍵則不是。

?Map的鍵值對個數(shù)可以從 size 屬性獲取,而 Object 的鍵值對個數(shù)只能手動計算。

?Object 都有自己的原型,原型鏈上的鍵名有可能和你自己在對象上的設(shè)置的鍵名產(chǎn)生沖突。

1.Map對象的屬性

?size:返回Map對象中所包含的鍵值對個數(shù)

1.Map對象的方法

?set(key, val): 向Map中添加新元素

?get(key): 通過鍵值查找特定的數(shù)值并返回

?has(key): 判斷Map對象中是否有Key所對應(yīng)的值,有返回true,否則返回false

?delete(key): 通過鍵值從Map中移除對應(yīng)的數(shù)據(jù)

?clear(): 將這個Map中的所有元素刪除

?

1

2

3

4

5

6

7

8

9

const m1 = newMap([['a', 111], ['b', 222]])

console.log(m1) // {"a" => 111, "b" => 222}

m1.get('a') // 111

const m2 = newMap([['c', 3]])

const m3 = newMap(m2)

m3.get('c') // 3

m3.has('c') // true

m3.set('d', 555)

m3.get('d') // 555

const m1 = new Map([['a', 111], ['b', 222]])

console.log(m1) // {"a" => 111, "b" => 222}

m1.get('a') // 111

const m2 = new Map([['c', 3]])

const m3 = new Map(m2)

m3.get('c') // 3

m3.has('c') // true

m3.set('d', 555)

m3.get('d') // 555

1.遍歷方法

?keys():返回鍵名的遍歷器

?values():返回鍵值的遍歷器

?entries():返回鍵值對的遍歷器

?forEach():使用回調(diào)函數(shù)遍歷每個成員

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

const map = newMap([['a', 1], ['b', 2]])


for(let key of map.keys()) {

?console.log(key)

}

// "a"

// "b"


for(let value of map.values()) {

?console.log(value)

}

// 1

// 2


for(let item of map.entries()) {

?console.log(item)

}

// ["a", 1]

// ["b", 2]


// 或者

for(let [key, value] of map.entries()) {

?console.log(key, value)

}

// "a" 1

// "b" 2

// for...of...遍歷map等同于使用map.entries()

for(let [key, value] of map) {

?console.log(key, value)

}

// "a" 1

// "b" 2

const map = new Map([['a', 1], ['b', 2]])

for (let key of map.keys()) {

console.log(key)

}

// "a"

// "b"

for (let value of map.values()) {

console.log(value)

}

// 1

// 2

for (let item of map.entries()) {

console.log(item)

}

// ["a", 1]

// ["b", 2]

// 或者

for (let [key, value] of map.entries()) {

console.log(key, value)

}

// "a" 1

// "b" 2

// for...of...遍歷map等同于使用map.entries()

for (let [key, value] of map) {

console.log(key, value)

}

// "a" 1

// "b" 2

1.map與其他數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換

?map轉(zhuǎn)換為數(shù)組(使用擴(kuò)展運(yùn)算符)

?

1

2

3

4

5

6

7

8

9

10

11

12

const arr = [[{'a': 1}, 111], ['b': 222]]


const myMap = newMap(arr)


[...myMap] // map轉(zhuǎn)數(shù)組。 [[{'a': 1}, 111], ['b': 222]]

?Map與對象的互換

const obj = {}

const map = newMap(['a', 111], ['b', 222])

for(let [key,value] of map) {

?obj[key] = value

}

console.log(obj) // {a:111, b: 222}

const arr = [[{'a': 1}, 111], ['b': 222]]

const myMap = new Map(arr)

[...myMap] // map轉(zhuǎn)數(shù)組。 [[{'a': 1}, 111], ['b': 222]]

?Map與對象的互換

const obj = {}

const map = new Map(['a', 111], ['b', 222])

for(let [key,value] of map) {

obj[key] = value

}

console.log(obj) // {a:111, b: 222}

?JSON字符串要轉(zhuǎn)換成Map可以先利用JSON.parse()轉(zhuǎn)換成數(shù)組或者對象,然后再轉(zhuǎn)換即可。

Set

Set對象允許你存儲任何類型的值,無論是原始值或者是對象引用。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。

Set 本身是一個構(gòu)造函數(shù),用來生成Set 數(shù)據(jù)結(jié)構(gòu)。Set函數(shù)可以接受一個數(shù)組(或者具有 iterable 接口的其他數(shù)據(jù)結(jié)構(gòu))作為參數(shù),用來初始化。

Set中的特殊值

Set 對象存儲的值總是唯一的,所以需要判斷兩個值是否恒等。有幾個特殊值需要特殊對待:

?+0 與 -0 在存儲判斷唯一性的時候是恒等的,所以不重復(fù)

?undefined 與 undefined 是恒等的,所以不重復(fù)

?NaN 與 NaN 是不恒等的,但是在 Set 中認(rèn)為NaN與NaN相等,所有只能存在一個,不重復(fù)。

1.Set實例對象的屬性

?size:返回Set實例的成員總數(shù)。

1.Set實例對象的方法

?add(value):添加某個值,返回 Set 結(jié)構(gòu)本身(可以鏈?zhǔn)秸{(diào)用)。

?delete(value):刪除某個值,刪除成功返回true,否則返回false。

?has(value):返回一個布爾值,表示該值是否為Set的成員。

?clear():清除所有成員,沒有返回值。

?

1

2

3

4

5

6

const mySet = newSet(['a', 'a', 'b', 1, 2, 1])

console.log(mySet) // {'a', 'b', 1, 2}

myset.add('c').add({'a': 1})

console.log(mySet) // {'a', 'b', 1, 2, 'c', {a: 1}}

console.log(mySet.size) // 6

mySet.has(2) // true

const mySet = new Set(['a', 'a', 'b', 1, 2, 1])

console.log(mySet) // {'a', 'b', 1, 2}

myset.add('c').add({'a': 1})

console.log(mySet) // {'a', 'b', 1, 2, 'c', {a: 1}}

console.log(mySet.size) // 6

mySet.has(2) // true

1.遍歷方法

?keys():返回鍵名的遍歷器。

?values():返回鍵值的遍歷器。

?entries():返回鍵值對的遍歷器。

?forEach():使用回調(diào)函數(shù)遍歷每個成員。

由于Set結(jié)構(gòu)沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys方法和values方法的行為完全一致。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

const set = newSet(['a', 'b', 'c'])

for(let item of set.keys()) {

?console.log(item)

}

// a

// b

// c

for(let item of set.values()) {

?console.log(item)

}

// a

// b

// c

for(let item of set.entries()) {

?console.log(item)

}

// ["a", "a"]

// ["b", "b"]

// ["c", "c"]

// 直接遍歷set實例,等同于遍歷set實例的values方法

for(let i of set) {

?console.log(i)

}

// a

// b

// c

set.forEach((value, key) => console.log(key + ' : '+ value))

// a: a

// b: b

// c: c

const set = new Set(['a', 'b', 'c'])

for (let item of set.keys()) {

console.log(item)

}

// a

// b

// c

for (let item of set.values()) {

console.log(item)

}

// a

// b

// c

for (let item of set.entries()) {

console.log(item)

}

// ["a", "a"]

// ["b", "b"]

// ["c", "c"]

// 直接遍歷set實例,等同于遍歷set實例的values方法

for (let i of set) {

console.log(i)

}

// a

// b

// c

set.forEach((value, key) => console.log(key + ' : ' + value))

// a: a

// b: b

// c: c

1.Set 對象作用

?數(shù)組去重(利用擴(kuò)展運(yùn)算符)

?

1

2

const mySet = newSet([1, 2, 3, 4, 4])

[...mySet] // [1, 2, 3, 4]

const mySet = new Set([1, 2, 3, 4, 4])

[...mySet] // [1, 2, 3, 4]

?合并兩個set對象

?

1

2

3

let a = newSet([1, 2, 3])

let b = newSet([4, 3, 2])

let union = newSet([...a, ...b]) // {1, 2, 3, 4}

let a = new Set([1, 2, 3])

let b = new Set([4, 3, 2])

let union = new Set([...a, ...b]) // {1, 2, 3, 4}

?交集

?

1

2

3

let a = newSet([1, 2, 3])

let b = newSet([4, 3, 2])

let intersect = newSet([...a].filter(x => b.has(x))) // {2, 3} 利用數(shù)組的filter方法

let a = new Set([1, 2, 3])

let b = new Set([4, 3, 2])

let intersect = new Set([...a].filter(x => b.has(x))) // {2, 3} 利用數(shù)組的filter方法

?差集

?

1

2

3

let a = newSet([1, 2, 3])

let b = newSet([4, 3, 2])

let difference = newSet([...a].filter(x => !b.has(x))) // {1}

let a = new Set([1, 2, 3])

let b = new Set([4, 3, 2])

let difference = new Set([...a].filter(x => !b.has(x))) // {1}

總結(jié)

以上所述是小編給大家介紹的一文搞懂ES6中的Map和Set,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容