摘要:和定義一組鍵值對的集合它是一組鍵值對的數(shù)據(jù)結(jié)構(gòu),由于之前的鍵必須是字符串。
Map和Set Map 定義:一組鍵值對的集合
它是一組鍵值對的數(shù)據(jù)結(jié)構(gòu),由于之前javascript的鍵(key)必須是字符串。為了使鍵可以是多種類型的于是在最新的es6中引入了map這種數(shù)據(jù)結(jié)構(gòu),這樣可以加快查詢速度,類似于查字典
方法和屬性var m = map() //空map m.set("學(xué)生年齡",6 ) //添加一對新的key-value m.has("學(xué)生年齡") //是否存在key學(xué)生年齡 true m.get("學(xué)生年齡") //拿到值 6 m.delete("學(xué)生年齡") // 刪除key學(xué)生年齡 m.clear() //清除所有成員 沒有返回值 m.size() // 返回map結(jié)構(gòu)的成員總數(shù) 1
需要注意的是如果多次對相同key值插入value,前一次的value值會被覆蓋
map中的鍵實際是對內(nèi)存地址的引用,舉例說明
var k1 = 222; var k2 = 222; map .set(k1, 123); .set(k2, 222); map.get(k1); // 123 map.get(k2); // 222
因此如果鍵值是對象的話就算值相同也是兩個不同的鍵,如果是簡單類型的話(number,boolean,string),只要值相等,就是同一個鍵,0和-0也被map視為同一鍵,NaN也是同一鍵
遍歷map的方法keys(): 返回鍵名的遍歷器
values(): 返回鍵值的遍歷器
entries():返回所有成員的遍歷器
forEach(): 遍歷所有map成員
map遍歷的順序就是插入的順序
使用實例
var m = new map( ["F", "no"], ["t", "yes"] ); for(let key of map.keys()) { console.log(key); } // f,t for(let key of map.values()) { console.log(key); } // no, yes for(let key of map) { console.log(key[0], key[1]); } // f no // t yes map.forEach( res => { console.log(res[0], res[1]); }); // f no // t yes
forEach方法還可以接受第二個參數(shù),用來綁定this。
類型轉(zhuǎn)換[ ] map如何轉(zhuǎn)換為數(shù)組
運用擴展運算符可以很方便的轉(zhuǎn)換
var m = map; m.set("a", 1); m.set("b", 2); [...map]; // [["a",1], ["b",2]];
[ ] 數(shù)組轉(zhuǎn)換為map
new Map([[true, 7], [{foo: 3}, ["abc"]]]) // Map {true => 7, Object {foo: 3} => ["abc"]}
[ ] map轉(zhuǎn)化為對象
如果鍵都是字符串
function mapToObj(strMap) { let obj = Object.create(null); for(let [k,v] of strMap) { obj[k] = v } return obj; } let map = new Map().set("yes",111); mapToObj(map); // {yes: 111};
[ ] 對象轉(zhuǎn)為map
function objToMap(obj) { let map = new Map(); for(let k of obj.keys()) { map.set(k.obj[k]); } return map; } objToStrMap({yes: true, no: false}); // [ [ "yes", true ], [ "no", false ] ]
[ ] map轉(zhuǎn)化為json
如果map鍵名都是字符串的話,可以轉(zhuǎn)化為對象json
function mapToJson(strMap) { return JSON.stringify(mapToObj(strMap)); // map轉(zhuǎn)化為對象在轉(zhuǎn)化為json } let map = new Map().set("yes", 111); strMapToJson(myMap) // "{"yes":true,"no":false}"
如果鍵名時非字符串的話,轉(zhuǎn)化為數(shù)組json
function mapToJson1(strMap) { return JSON.stringify([...strMap]); //map轉(zhuǎn)化為數(shù)組在轉(zhuǎn)化為數(shù)組json } let myMap = new Map().set(true, 7).set({foo: 3}, ["abc"]); mapToArrayJson(myMap) // "[[true,7],[{"foo":3},["abc"]]]"
json轉(zhuǎn)化為map同理只是return的是JSON.parse()方法 也分為鍵名是字符串和非字符串
Set 特點類型于數(shù)組。但是它的成員值都是唯一的,可以用來做數(shù)組去重
構(gòu)造函數(shù)var a = new Set([1,2,2,3,4,555,5,5,6]); [...a]; // [1,2,3,4,555,6];
這是一個數(shù)組去重的例子在set內(nèi)部如果有兩個NAN會去掉一個
方法add(value): 添加值 返回set結(jié)構(gòu)本身
delete(value): 刪除某個值 返回布爾值 表示是否刪除成功
has(value): 返回布爾值 表示該值是否為set的成員
clear(): 清除所有成員
數(shù)組去重的兩種方法
var arr = [1,2,3,4,4,5]; var aSet = new Set(arr); [...aSet]; //[1,2,3,4,5] var bSet = new Set(arr); arr = Array.from(bSet); // [1,2,3,4,5]
由于set的keys()和values()完全一樣所以無法通過set[xxx]的方式找到其內(nèi)部的值,
遍歷set的方法
keys(): 返回鍵名和遍歷器
values(): 返回鍵值和遍歷器
entires(): 返回鍵值對的遍歷器
forEach(): 使用回調(diào)函數(shù)遍歷每個成員
let set = new Set(["red", "green", "blue"]); for (let item of set.keys()) { console.log(item); } // red // green // 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"]
forEach對空數(shù)組不會執(zhí)行回調(diào)函數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/103305.html
摘要:數(shù)組的解構(gòu)賦值規(guī)定允許按照一定模式,從數(shù)組和對象中提取值對變量進行賦值,我們稱之為解構(gòu)。的規(guī)則是,只要有可能導(dǎo)致解構(gòu)的歧義,就不得使用圓括號。 數(shù)組的解構(gòu)賦值 ES6規(guī)定:允許按照一定模式,從數(shù)組和對象中提取值對變量進行賦值,我們稱之為解構(gòu)。以前賦值只能直接指定值 let a = 1; let b = 2; let c = 3; ES6允許以下這種做法 let [a, b, c] = ...
摘要:類似于數(shù)組,但是中不存在重復(fù)元素??梢越邮芤粋€數(shù)組或者其他具有接口的數(shù)據(jù)結(jié)構(gòu)作為參數(shù)從上面的代碼可以看出有去重的功能。去重還有另一個方法將數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成數(shù)組。清除實例的指定成員。返回一個布爾值,表示某個值是否在實例之中。 Set Set類似于數(shù)組,但是Set中不存在重復(fù)元素。Set可以接受一個數(shù)組(或者其他具有itarable接口的數(shù)據(jù)結(jié)構(gòu))作為參數(shù) const set = ne...
摘要:有種東西學(xué)了記不住,是正則表達式,就是了。最近在用寫個,我一個按鍵盤的,又沒什么太多的閑錢去購買高大上的,不得已開始用上了學(xué)的好多遍都沒學(xué)會的。 有10種東西學(xué)了記不住,00是正則表達式,10就是Vim了。 最近在用python寫個side project,我一個按鍵盤的,又沒什么太多的閑錢去購買高大上的IDE,不得已開始用上了學(xué)的好多遍都沒學(xué)會的Vim。Vim有多牛X,隨便問一個代碼...
摘要:有種東西學(xué)了記不住,是正則表達式,就是了。最近在用寫個,我一個按鍵盤的,又沒什么太多的閑錢去購買高大上的,不得已開始用上了學(xué)的好多遍都沒學(xué)會的。 有10種東西學(xué)了記不住,00是正則表達式,10就是Vim了。 最近在用python寫個side project,我一個按鍵盤的,又沒什么太多的閑錢去購買高大上的IDE,不得已開始用上了學(xué)的好多遍都沒學(xué)會的Vim。Vim有多牛X,隨便問一個代碼...
摘要:底層的數(shù)據(jù)結(jié)構(gòu)就是數(shù)組鏈表紅黑樹,紅黑樹是在中加進來的。負載因子哈希表中的填滿程度。 前言 把 Java 容器的學(xué)習筆記放到 github 里了,還在更新~其他的目前不打算抽出來作為文章寫,感覺挖的還不夠深,等對某些東西理解的更深了再寫文章吧Java 容器目錄如下: Java 容器 一、概述 二、源碼學(xué)習 1. Map 1.1 HashMap 1.2 LinkedHashM...
閱讀 3061·2023-04-26 02:27
閱讀 2773·2021-11-22 13:54
閱讀 910·2021-11-12 10:36
閱讀 3765·2021-10-09 09:44
閱讀 3188·2021-10-09 09:41
閱讀 1235·2021-09-22 10:02
閱讀 2845·2019-08-30 15:56
閱讀 3112·2019-08-30 11:02