ES6學習筆記 Set和Map

2022-03-26 17:15:16 字數 4808 閱讀 8799

set類似於陣列,但是沒有重複的值,成員是唯一的。

set例項有兩個屬性:set.prototype.constructor指向set本身,set.prototype.size返回set例項的成員總數。

set例項的方法分為兩大類:操作方法(用於運算元據)和遍歷方法(用於遍歷成員):

array.from方法可以將set結構轉為數值。

var set = new set([1,2,3,4,5,4,3,2,1]);

var arr = array.from(set);

//因此可以這樣對陣列去重

function dedupe(arr);

dedupe([1,1,1,2,2,2]); // [1,2]

//另一種更簡潔的陣列去重方法:[...new set(arr)]

[...new set([111,222,111,222])]; // [111,222]

向set加入值的時候,不會發生型別轉換,所以5跟'5'是不同的值。

set內部判斷兩個值是否相同,使用的演算法叫'same-value equality',它類似於全等=,區別是nan ! nan,但是在set內部,nan是等於自身的。

var set = new set();

set.add('5').add(nan).add(5).add(nan);

set.size;//3

set;//

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

for(let item of set.keys())

//red

//green

//blue

for(let item of set.values())

//red

//green

//blue

for(let item of set.entries())

//['red','red']

//['green','green']

//['blue','blue']

set結構的例項預設可遍歷,它的預設遍歷器生成函式就是它的values方法,因此可以省略values方法,直接用for...of迴圈遍歷set.

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

for(let item of set);

//red

//green

//blue

set結構的例項foreach方法,用於對每個成員執行某種操作,沒有返回值

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

set.foreach((value,key) => console.log(value * 2));

//2,4,6

使用擴充套件運算子可以將陣列的map和filter方法用於set

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

set = new set([...set].map(x => x * 2));

set = new set([...set].filter(x => (x % 2) == 0)

因此可以使用set可以很容易實現並集,交集和差集

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

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

//並集

let union = new set([...a,...b]);

//交集

let intersect = new set([...a].filter(x => b.has(x)));

//差集

let difference = new set([...a].filter(x => !b.has(x)));

js的物件,object,是鍵值對的集合(hash結構),但是只能使用字串當作鍵。

var data = {},body = document.queryselector('body');

data[body] = 'bodyele';

data['[object htmlbodyelement]']; // 'bodyele' //dom節點作為data的鍵值被自動轉為字串

為了解決類似這種的問題,es6提供了map資料結構。object是『字串--值』的對應,map是『值--值』的對應,是一種更完善的hash結構

var m = new map(),

o = ;

m.set(o,'content');

m.get(o); // 'content'

m.has(o); // true

m.size; // 1

m.delete(o);// true

m.has(o); // false

m.size; // 0

var m = new map([

[true,'foo'],

['true','bar']

]);m.get(true); // 'foo'

m.get('true'); // 'bar' // true跟'true'是兩個不同的值

m.set(0,false).set(0,'false');

m.get(0); // 'false' // 對同乙個鍵多次賦值,後面的會覆蓋前面的

m.get(1); // undefined // 讀取乙個未知的鍵,返回undefined

對於引用型別的鍵值,要特別小心

var map = new map();

map.set(['a'],666);

map.get(['a']); // undefined // ['a'] != ['a']

var k1 = ['b'], k2 = ['b']; // k1 != k2

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

map.get(k1); // 111

map.get(k2); // 222

對於基本型別的值,只要兩個值全等,map將其視為乙個鍵,包括0和-0。另外,在map裡,nan等於自身

let map = new map();

map.set(nan,123);

map.get(nan); // 123

map.set(0,456);

map.get(-0); // 456

let map = new map([

[0,false],

[1,true]

]);for(let key of map.keys())

for(let val of map.values())

for(let item of map.entries())

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

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

map轉化為陣列,比較快速的方法是使用擴充套件運算子(...)

let map = new map([

[1,'one'],

[2,'two'],

[3,'three']

]);[...map.keys()]; // [1,2,3]

[...map.values()];// ['one','two','three']

[...map.entries()];// [[1,'one'], [2, 'two'], [3, 'three']]

[...map]; // [[1,'one'], [2, 'two'], [3, 'three']]

//陣列轉化為map直接將陣列傳入map的建構函式

new map([[1,'one'],[2,'two']]);

map本身沒有filter,map方法,可以使用陣列來實現

let map0 = new map()

.set(1,'a')

.set(2,'b')

.set(3,'c');

let map1 = new map(

[...map0].filter(([key,val]) => key < 3)

);let map2 = new map(

[...map0].map(([key,val]) => [key*2,val+'a'])

)

map的foreach方法,與陣列的foreach方法類似,可以實現遍歷

map.foreach(function(val,key,map),window)
map與物件互轉

//如果所有map的鍵都是字串,則可以轉為物件

function maptoobj(strmap);

for(let [key,val] of strmap);

return obj;

}let mymap = new map().set('yes', true).set('no', false);

maptoobj(mymap);

// //物件轉map

function objtomap(obj)

return map;

}objtomap();

// [ [ 'yes', true ], [ 'no', false ] ]

es6學習之Set和Map結構

set結構是類似於陣列結構,但是成員都是不重複的值 判斷不重複類似object.is 方法,但是 0和 0又是相同的處理,object.is 0,0 false 缺點是沒辦法像陣列一樣通過下標取值的方法.weekset結構和set相似,但是成員只能是物件,且物件是弱引用 成員中的物件不存在了,在本結...

ES6入門之set和map

es6提供了新的資料結構set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。set函式可以接受乙個陣列 或類似陣列的物件 作為引數,用來初始化。例一 var set new set 1,2,3,4,4 set 1,2,3,4 var s newset 2,3,5,4,5,2,2 map x ...

ES6入門之set和map

es6提供了新的資料結構set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。set函式可以接受乙個陣列 或類似陣列的物件 作為引數,用來初始化。例一 var set new set 1,2,3,4,4 set 1,2,3,4 var s new set 2,3,5,4,5,2,2 map x...