摘要:本身是一個構造函數,用來生成數據結構。該數組的成員是一個個表示鍵值對的數組。張三張三事實上,不僅僅是數組,任何具有接口每個成員都是一個雙元素的數組的數據結構都剋以當作構造函數的參數。實例的屬性和操作方法屬性屬性返回結構的成員總數。
ES6提供了新的數據結構Set,它類似與數組,但是成員值都是唯一的,沒有重復的值。 Set本身是一個構造函數,用來生成Set數據結構。
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結構加入成員,結果表明Set結構不會添加重復的值。
Set函數可以接受一個數組作為參數,用來初始化。
//例子1 const set = new Set([1,2,3,4,4]); [...set];//[1,2,3,4] //例子2 const items = new Set([1,2,3,4,5,5,5,5]); items.size//5 //例子3 const set = new Set(document.querySelectorAll("div"));
上面代碼中,例一和例二都是Set函數接受數組作為參數,例三是接受類似數組的對象作為參數。
上面代碼也展示了一種去除數組重復成員的方法。
//去除數組的重復成員 [...new Set(array)] //去除字符串里面的重復字符 [...new Set("ababbc")].join("");//"abc" //下面代碼向Set實例添加了兩個NaN,但是只能加入一個。這表明在Set內部兩個NaN是相等。 let set = new Set(); let a = NaN; let b = NaN; set.add(a); set.add(b); set // Set {NaN} //另外,兩個對象總是不相等的。 let set = new Set(); set.add({}); set.size // 1 set.add({}); set.size // 2Set實例的屬性和方法
Set結構的實例有以下屬性。
-Set.prototype.constructor:構造函數,默認就是set函數。 -Set.prototype.size:返回Set實例的成員總數。
Set實例的方法分為兩大類:操作方法和遍歷方法。下面先介紹四個操作方法。
-add(value):添加某個值,返回Set結構本身。 -delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。 -has(value):返回一個布爾值,表示該值是否為Set的成員。 -clear();清除所有成員,沒有返回值。
下面這些屬性和方法的示例如下:
s.add(1).add(2).add(2); //注意2被加入了兩次 s.size//2 s.has(1)//true s.has(2)//true s.has(3)//false s.delete(2); s.has(2)//false
下面是一個對比,看看在判斷是否包括一個鍵上面,Object結構和Set結構的寫法不同。
//對象的寫法 const properties ={ "width":1, "height":1 }; if(properties[someName]){ //do something } //Set的寫法 const properties = new Set(); properties.add("width"); properties.add("height"); if(properties.has(someName)){ //do something }
Array.from方法可以將Set結構轉為數組。
const items = new Set([1,2,3,4,5]); const array = Array.from(items);
這就提供了去除數組重復成員的另一種方法。
function dedupe(array){ return Array.from(new Set(array)); }; dedupe([1,1,2,3])//[1,2,3]遍歷操作
Set 結構的實例有四個遍歷方法,可以用于遍歷成員。
-keys():返回鍵名的遍歷器。 -values():返回鍵值的遍歷器。 -entries():返回鍵值對的遍歷器。 -forEach():使用回調函數遍歷每個成員。
(1)keys(),value(),entries()
keys方法、values方法、entries方法返回的都是遍歷器對象。由于Set結構沒有鍵名,只有鍵值所以keys方法和values方法的行為完全一致。
let set = new Set(["red","green","blue"]); for(let item of set.keys){ console.log(items);//red,grren,blue } for(let item of set.values){ console.log(item);//red,green,blue } for(let item of set.entries){ console.log(item) } //["red","red"]["green","green"]["blue","blue"]
上面代碼中,entries方法返回的遍歷器,同時包括鍵名和鍵值,所以每次輸出一個數組,它的兩個成員完全相等。
Set結構的實例默認可遍歷,它的默認遍歷器生成函數就是它的values方法。
Set.prototype[Symbol.iterator] === Set.prototype.values
這就意味著,可以省略values方法,直接用for...of循環遍歷Set。
let set = new Set(["red","green","blue"]); for(let x of set){ console.log(x); } //red green blue
(2)forEach()
Set結構的實例與數組一樣,也擁有forEach方法,用于對每個成員執行某種操作,沒有返回值。
let set = new Set([1,4,9]); set.forEach((value,key)=>console.log(key+":"+value)) //1:1 4:4 9:9
上面代碼說明,foreach方法的參數就是一個處理函數。該函數的參數與數組的forEach一致,依次為鍵值、鍵名、集合本身。這里需要注意,Set結構的鍵名就是鍵值,因此第一個參數與第二個參數的值永遠都是一樣的。另外,forEach方法還可以有第二個參數,表示綁定處理函數內部的this對象。
(3)遍歷的應用
擴展運算符(...)內部使用for...of循環,所以也可以使用Set結構。
let set = new Set(["red","green","blue"]); let arr = [...set]; //["red","green","blue"] 擴展運算符和Set結構相結合,就可以去除數組的重復成員。 let arr = [3,5,2,2,5,5]; let unique = [...new Set(arr)] //[3,5,2]
而且,數組的map和filter方法也可以間接用于Set了。
let set = new Set([1,2,3]); set = new Set([...set].map(x=x>*2)); //返回set結構:{2,4,6} let set = new Set([1,2,3,4,5]); set = new Set([...set].filter(x=>(x%2)==0)); //返回Set結構:{2,4}
因此使用Set可以很容易地實現并集、交集、和差集。
let a = new Set([1,2,3]); let b = new Set([4,3,2]); //并集 let union = new Set([...a,...b]); //Set {1,2,3,4} //交集 let intersect = new Set([...a].filter(x=>b.has(x))); //set{2,3} //差集 let difference = new Set([...a].filter(x=>!b.has(x))); //Set{1}Map含義和基本用法
Javascript的對象,本質上是鍵值對的集合,但是傳統上只能用字符串當作鍵,這給它的使用帶來了很大的限制。
const data = {}; const element = document.getElementById("myDiv"); data[element] = "metadata"; data["[object HTMLDivElement]"]//"metadata"
上面代碼原意是將一個DOM節點作為對象data的鍵,但是由于對象只接受字符串作為鍵名,所以element被自動轉為字符串[object HTMLDivElement].
為了解決這個問題,ES6提供了Map數據結構。他類似與對象,也是鍵值對的集合,但是鍵的范圍不限于字符串,各種類型的值都可以當作鍵。也就是說,Object結構提供了字符串-值的對應,Map結構提供了值-值的對應,是一種更完善的Hash結構實現。如果你需要鍵值對的數據結構,Map比Object更合適。
const m = new Map(); const o = {p:"Hello World"}; m.set(o,"content"); m.get(o)//"content" m.has(o)//true m.delete(o)//true m.has(o)//false
上面代碼使用Map結構set方法,將對象o當作m的一個鍵,然后又使用get方法讀取這個鍵,接著使用delete方法刪除這個鍵。
上面的例子展示了如何向Map添加成員。作為構造函數,Map也可以接受一個數組作為參數。該數組的成員是一個個表示鍵值對的數組。
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
事實上,不僅僅是數組,任何具有Iterator接口、每個成員都是一個雙元素的數組的數據結構都剋以當作Map構造函數的參數。也就是說,Set和Map都可以用來生成新的Map。
const set = new Set([ ["foo",1], ["bar",2] ]) const m1 = new Map(set); m1.get("foo")//1 const m2 = new Map([["baz",3]]); const m3 = new Map(m2); m3.get("baz")//3
上面代碼中,我們分別使用set對象和Map對象,當作Map構造函數的參數,結果都生成了新的Map對象。
如果對同一個鍵多次賦值,后面的值將覆蓋前面的值。
const map = new Map(); map.set(1,"aaa") .set(1,"bbb") map,get(1)//"bbb"
上面代碼對鍵1連續賦值兩次,后一次的值覆蓋前一次的值。
如果讀取一個未知的鍵,則返回undefined。
new Map().get("dsada")//undefined.實例的屬性和操作方法
(1)size屬性
size屬性返回Map結構的成員總數。
const map = new Map() map.set("foo",true) map.set("bar",false) map.szie//2
(2)set(key,value)
set方法設置鍵名key對應的鍵值為value,然后返回整個map結構。如果key已經有值,則鍵值會被更新,否則就新生成該鍵。
const m = new Map() m.set("edition",6);//鍵是字符串 m.set(262,"standard");//鍵是數值 m.set(undefined,"nah");//鍵是undefined
set方法返回的是當前的Map對象,因此剋以采用鏈式寫法。
let map = new Map() .set(1,"a") .set(2,"b") .set(3,"c")
(3)get(key)
get方法讀取key對應的鍵值,如果找不到key,返回undefined。
const m = new Map(); const hello = function(){console.log("hello");}; m.set(hello,"Hello ES6")//鍵是函數 m.get(hello)//Hello ES6
(4)has(key)
has方法返回一個布爾值,表示某個鍵是否在當前Map對象之中。
const m = new Map(); m.set("edition",6); m.set("262","standard"); m.set(undefined,"nah"); m.has("edition")//true
(5)delete(key)
delete方法刪除某個鍵,返回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;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101620.html
摘要:學習筆記工作中常用到的語法只是簡單提及和,今天有空于是寫了這篇文章深入理解中的和數據結構,與其它數據結構的互相轉換。的提供了新的數據結構。本身是一個構造函數,用來生成數據結構。 文中的內容主要是來自于阮一峰的《ES6標準入門》(第三版)。《學習ES6筆記──工作中常用到的ES6語法》只是簡單提及Set和Map,今天有空于是寫了這篇文章──《深入理解:ES6中的Set和Map數據結構,M...
摘要:返回一個布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。返回的都是遍歷器對象。結構的實例的方法,用于對每個成員執行某種操作,沒有返回值。這個特點意味著,無法引用的成員,因此是不可遍歷的。數組成員是一個或多個表示鍵值對的一維數組。 本文字數:4700+,閱讀時間約10分鐘。 如果有理解不到位的地方,歡迎大家糾錯。 一、Set 【01】Set是一種數據結構。類似于數組,但是成員的值...
摘要:類似于與的區別和的對比與對比數據結構橫向對比,增查改刪增查改刪與對比增查改刪與對比增查改刪建議優先使用,不使用,特別是復雜的數據結構考慮數據唯一性,使用,放棄和 Set 1.add()方法和size屬性 { let list = new Set(); // add()方法向Set數據添加元素 list.add(5); list.add(7); /...
摘要:返回一個布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。該數組中的每一項也必須是數組,內部數組的首個項會作為鍵,第二項則為對應值。返回所有成員的遍歷器需要特別注意的是,的遍歷順序就是插入順序。 Js大部分歷史時期都只存在一種集合類型,也就是數組類型。數組在 JS 中的使用正如其他語言的數組一樣,但缺少更多類型的集合導致數組也經常被當作隊列與棧來使用。數組只使用了數值型的索引,而...
摘要:的默認遍歷器是另外這里需要格外強調的是中的方法是判斷鍵值是否存在的,如中的方法是判斷鍵名是否存在的,如解構轉換技巧轉轉為防止不必要的錯誤,直接丟棄不是字符串為鍵的屬性轉和類似,不過它只接受對象作為鍵名,除外。 Set Set 是一種集合結構,特征和數學中的一致,具有以下特征: 同一個集合中不能有相同元素 set 可以存放不同類型的數據 但使用過程中請注意以下幾點: 存入 set ...
閱讀 2227·2021-11-15 11:39
閱讀 982·2021-09-26 09:55
閱讀 925·2021-09-04 16:48
閱讀 2831·2021-08-12 13:23
閱讀 919·2021-07-30 15:30
閱讀 2455·2019-08-29 14:16
閱讀 886·2019-08-26 10:15
閱讀 525·2019-08-23 18:40