成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Set和Map數(shù)據(jù)結(jié)構(gòu)。

lixiang / 1460人閱讀

摘要:本身是一個(gè)構(gòu)造函數(shù),用來生成數(shù)據(jù)結(jié)構(gòu)。該數(shù)組的成員是一個(gè)個(gè)表示鍵值對的數(shù)組。張三張三事實(shí)上,不僅僅是數(shù)組,任何具有接口每個(gè)成員都是一個(gè)雙元素的數(shù)組的數(shù)據(jù)結(jié)構(gòu)都剋以當(dāng)作構(gòu)造函數(shù)的參數(shù)。實(shí)例的屬性和操作方法屬性屬性返回結(jié)構(gòu)的成員總數(shù)。

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ù)的值。
Set函數(shù)可以接受一個(gè)數(shù)組作為參數(shù),用來初始化。

//例子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函數(shù)接受數(shù)組作為參數(shù),例三是接受類似數(shù)組的對象作為參數(shù)。
上面代碼也展示了一種去除數(shù)組重復(fù)成員的方法。

//去除數(shù)組的重復(fù)成員
[...new Set(array)]
//去除字符串里面的重復(fù)字符
[...new Set("ababbc")].join("");//"abc"
//下面代碼向Set實(shí)例添加了兩個(gè)NaN,但是只能加入一個(gè)。這表明在Set內(nèi)部兩個(gè)NaN是相等。
let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}
//另外,兩個(gè)對象總是不相等的。
let set = new Set();
set.add({});
set.size // 1
set.add({});
set.size // 2
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í)例的方法分為兩大類:操作方法和遍歷方法。下面先介紹四個(gè)操作方法。

-add(value):添加某個(gè)值,返回Set結(jié)構(gòu)本身。
-delete(value):刪除某個(gè)值,返回一個(gè)布爾值,表示刪除是否成功。
-has(value):返回一個(gè)布爾值,表示該值是否為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

下面是一個(gè)對比,看看在判斷是否包括一個(gè)鍵上面,Object結(jié)構(gòu)和Set結(jié)構(gòu)的寫法不同。

//對象的寫法
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結(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è)成員。

(1)keys(),value(),entries()
keys方法、values方法、entries方法返回的都是遍歷器對象。由于Set結(jié)構(gòu)沒有鍵名,只有鍵值所以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方法返回的遍歷器,同時(shí)包括鍵名和鍵值,所以每次輸出一個(gè)數(shù)組,它的兩個(gè)成員完全相等。
Set結(jié)構(gòu)的實(shí)例默認(rèn)可遍歷,它的默認(rèn)遍歷器生成函數(shù)就是它的values方法。

Set.prototype[Symbol.iterator] === Set.prototype.values

這就意味著,可以省略values方法,直接用for...of循環(huán)遍歷Set。

let set = new Set(["red","green","blue"]);
for(let x of set){
    console.log(x);
}
//red green blue

(2)forEach()
Set結(jié)構(gòu)的實(shí)例與數(shù)組一樣,也擁有forEach方法,用于對每個(gè)成員執(zhí)行某種操作,沒有返回值。

let set = new Set([1,4,9]);
set.forEach((value,key)=>console.log(key+":"+value))
//1:1 4:4 9:9

上面代碼說明,foreach方法的參數(shù)就是一個(gè)處理函數(shù)。該函數(shù)的參數(shù)與數(shù)組的forEach一致,依次為鍵值、鍵名、集合本身。這里需要注意,Set結(jié)構(gòu)的鍵名就是鍵值,因此第一個(gè)參數(shù)與第二個(gè)參數(shù)的值永遠(yuǎn)都是一樣的。另外,forEach方法還可以有第二個(gè)參數(shù),表示綁定處理函數(shù)內(nèi)部的this對象。
(3)遍歷的應(yīng)用
擴(kuò)展運(yùn)算符(...)內(nèi)部使用for...of循環(huán),所以也可以使用Set結(jié)構(gòu)。

let set = new Set(["red","green","blue"]);
let arr = [...set];
//["red","green","blue"]
擴(kuò)展運(yùn)算符和Set結(jié)構(gòu)相結(jié)合,就可以去除數(shù)組的重復(fù)成員。
let arr = [3,5,2,2,5,5];
let unique = [...new Set(arr)]
//[3,5,2]

而且,數(shù)組的map和filter方法也可以間接用于Set了。

let set = new Set([1,2,3]);
set = new Set([...set].map(x=x>*2));
//返回set結(jié)構(gòu):{2,4,6}

let set = new Set([1,2,3,4,5]);
set = new Set([...set].filter(x=>(x%2)==0));
//返回Set結(jié)構(gòu):{2,4}

因此使用Set可以很容易地實(shí)現(xiàn)并集、交集、和差集。

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的對象,本質(zhì)上是鍵值對的集合,但是傳統(tǒng)上只能用字符串當(dāng)作鍵,這給它的使用帶來了很大的限制。

const data = {};
const element = document.getElementById("myDiv");
data[element] = "metadata";
data["[object HTMLDivElement]"]//"metadata"

上面代碼原意是將一個(gè)DOM節(jié)點(diǎn)作為對象data的鍵,但是由于對象只接受字符串作為鍵名,所以element被自動(dòng)轉(zhuǎn)為字符串[object HTMLDivElement].
為了解決這個(gè)問題,ES6提供了Map數(shù)據(jù)結(jié)構(gòu)。他類似與對象,也是鍵值對的集合,但是鍵的范圍不限于字符串,各種類型的值都可以當(dāng)作鍵。也就是說,Object結(jié)構(gòu)提供了字符串-值的對應(yīng),Map結(jié)構(gòu)提供了值-值的對應(yīng),是一種更完善的Hash結(jié)構(gòu)實(shí)現(xiàn)。如果你需要鍵值對的數(shù)據(jù)結(jié)構(gòu),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結(jié)構(gòu)set方法,將對象o當(dāng)作m的一個(gè)鍵,然后又使用get方法讀取這個(gè)鍵,接著使用delete方法刪除這個(gè)鍵。
上面的例子展示了如何向Map添加成員。作為構(gòu)造函數(shù),Map也可以接受一個(gè)數(shù)組作為參數(shù)。該數(shù)組的成員是一個(gè)個(gè)表示鍵值對的數(shù)組。

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

事實(shí)上,不僅僅是數(shù)組,任何具有Iterator接口、每個(gè)成員都是一個(gè)雙元素的數(shù)組的數(shù)據(jù)結(jié)構(gòu)都剋以當(dāng)作Map構(gòu)造函數(shù)的參數(shù)。也就是說,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對象,當(dāng)作Map構(gòu)造函數(shù)的參數(shù),結(jié)果都生成了新的Map對象。
如果對同一個(gè)鍵多次賦值,后面的值將覆蓋前面的值。

const map = new Map();
map.set(1,"aaa")
   .set(1,"bbb")
map,get(1)//"bbb"

上面代碼對鍵1連續(xù)賦值兩次,后一次的值覆蓋前一次的值。
如果讀取一個(gè)未知的鍵,則返回undefined。

new Map().get("dsada")//undefined.
實(shí)例的屬性和操作方法

(1)size屬性
size屬性返回Map結(jié)構(gòu)的成員總數(shù)。

const map = new Map()
map.set("foo",true)
map.set("bar",false)
map.szie//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

set方法返回的是當(dāng)前的Map對象,因此剋以采用鏈?zhǔn)綄懛ā?/p>

let map = new Map()
    .set(1,"a")
    .set(2,"b")
    .set(3,"c")

(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

(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;

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101620.html

相關(guān)文章

  • 深入理解:ES6中的SetMap數(shù)據(jù)結(jié)構(gòu),Map與其它數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換

    摘要:學(xué)習(xí)筆記工作中常用到的語法只是簡單提及和,今天有空于是寫了這篇文章深入理解中的和數(shù)據(jù)結(jié)構(gòu),與其它數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換。的提供了新的數(shù)據(jù)結(jié)構(gòu)。本身是一個(gè)構(gòu)造函數(shù),用來生成數(shù)據(jù)結(jié)構(gòu)。 文中的內(nèi)容主要是來自于阮一峰的《ES6標(biāo)準(zhǔn)入門》(第三版)?!秾W(xué)習(xí)ES6筆記──工作中常用到的ES6語法》只是簡單提及Set和Map,今天有空于是寫了這篇文章──《深入理解:ES6中的Set和Map數(shù)據(jù)結(jié)構(gòu),M...

    Cristalven 評論0 收藏0
  • 【ES6腳丫系列】Set+WeakSet+Map+WeakMap

    摘要:返回一個(gè)布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。返回的都是遍歷器對象。結(jié)構(gòu)的實(shí)例的方法,用于對每個(gè)成員執(zhí)行某種操作,沒有返回值。這個(gè)特點(diǎn)意味著,無法引用的成員,因此是不可遍歷的。數(shù)組成員是一個(gè)或多個(gè)表示鍵值對的一維數(shù)組。 本文字?jǐn)?shù):4700+,閱讀時(shí)間約10分鐘。 如果有理解不到位的地方,歡迎大家糾錯(cuò)。 一、Set 【01】Set是一種數(shù)據(jù)結(jié)構(gòu)。類似于數(shù)組,但是成員的值...

    lyning 評論0 收藏0
  • 【ES6入門09】:SetMap數(shù)據(jù)結(jié)構(gòu)

    摘要:類似于與的區(qū)別和的對比與對比數(shù)據(jù)結(jié)構(gòu)橫向?qū)Ρ龋霾楦膭h增查改刪與對比增查改刪與對比增查改刪建議優(yōu)先使用,不使用,特別是復(fù)雜的數(shù)據(jù)結(jié)構(gòu)考慮數(shù)據(jù)唯一性,使用,放棄和 Set 1.add()方法和size屬性 { let list = new Set(); // add()方法向Set數(shù)據(jù)添加元素 list.add(5); list.add(7); /...

    Codeing_ls 評論0 收藏0
  • es6 Mapset

    摘要:返回一個(gè)布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。該數(shù)組中的每一項(xiàng)也必須是數(shù)組,內(nèi)部數(shù)組的首個(gè)項(xiàng)會(huì)作為鍵,第二項(xiàng)則為對應(yīng)值。返回所有成員的遍歷器需要特別注意的是,的遍歷順序就是插入順序。 Js大部分歷史時(shí)期都只存在一種集合類型,也就是數(shù)組類型。數(shù)組在 JS 中的使用正如其他語言的數(shù)組一樣,但缺少更多類型的集合導(dǎo)致數(shù)組也經(jīng)常被當(dāng)作隊(duì)列與棧來使用。數(shù)組只使用了數(shù)值型的索引,而...

    superPershing 評論0 收藏0
  • ECMAScript6(11):SetMap

    摘要:的默認(rèn)遍歷器是另外這里需要格外強(qiáng)調(diào)的是中的方法是判斷鍵值是否存在的,如中的方法是判斷鍵名是否存在的,如解構(gòu)轉(zhuǎn)換技巧轉(zhuǎn)轉(zhuǎn)為防止不必要的錯(cuò)誤,直接丟棄不是字符串為鍵的屬性轉(zhuǎn)和類似,不過它只接受對象作為鍵名,除外。 Set Set 是一種集合結(jié)構(gòu),特征和數(shù)學(xué)中的一致,具有以下特征: 同一個(gè)集合中不能有相同元素 set 可以存放不同類型的數(shù)據(jù) 但使用過程中請注意以下幾點(diǎn): 存入 set ...

    BothEyes1993 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<