Set和Map數據結構

1、Set

一、概述:

  • ES6提供新的數據結構Set,相似於數組,可是成員的值是惟一的,沒有重複值。也就是說Set是不重複的值的集合es6

  • 沒有鍵名,只有鍵值,或說鍵名和鍵值是同一個值,兩個值永遠是相等的數組

  • 接受一個數組做爲參數,用來初始化markdown

const set = new Set([1,2,3,4,4]);
consle.log(set);//[1,2,3,4]
console.log([...set]);//[1,2,3,4]
複製代碼

二、屬性和方法

操做方法:

  • .add( ) 添加某一個值,返回的是Set結構自己數據結構

  • .delete( ) 刪除某個值,返回一個布爾值,表示刪除是否成功函數

  • .has( ) 返回一個布爾值,表示該值是否爲Set的成員oop

  • .clear( ) 清除全部成員,沒有返回值學習

遍歷方法:

  • .keys( ) 返回鍵名
  • .values( ) 返回鍵值

​ 由於Set沒有鍵名只有鍵值,或說鍵名和鍵值是同一個值,因此.values( )和.keys()行爲一致ui

​ Set結構的實例默承認遍歷,因此能夠省略.values方法;spa

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

let set2 = new Set(["red", "green", "blue"]);
for (let i of set2.values()) {
  console.log("set.values:", i);
}

let set4 = new Set(["red", "green", "blue"]);
for (let i of set4) {
   console.log("Set結構的實例默承認遍歷:", i);
}
複製代碼
  • .entries( ) 返回鍵值對
  • .forEach( )

三、Set結構如何轉爲數組:使用Array.from

Array.from方法能夠將 Set 結構轉爲數組3d

四、使用場景:

(1)去除數組重複成員

//實例1
const set = new Set([1, 2, 3, 4, 4]);
console.log(set);//[1,2,3,4]

//實例2
const items = new Set([1, 2, 3, 4, 4, 5, 6, 6]);
const array = Array.from(items);//[1,2,3,4,5,6]

//實例3
function unique(array){
   //判斷是否是數組,不是就直接return
  if (!(arr instanceof Array)) {
    console.log("傳入的不是數組");
    return
  } else {
     return Array.from(new Set(array));//Array.from方法能夠將Set結構轉爲數組
  }
}

unique([1,1,2,3]);//[1,2,3]
unique('111');//傳入的不是數組
複製代碼

注意:Set該方法只針對通常數組,好比[1, 2, 3, 4, 4]這種,若是數組裏面還有對象,該方法不適用,好比 [{a: 1} , {a: 1} , {a: 2}]這種。

(2)去除字符串重複字符

const str = "ascddsdfg";
const DEPLICATE_STR = new Set(str);
console.log([...DEPLICATE_STR].join(''));//ascdfg
複製代碼

join( )將數組中的全部元素轉換成一個字符串;

(3)求並集/交集/差集

數組的map和filter方法能夠間接用於Set,Set自己沒有map和filter方法的哦~

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

let union = [...new Set([...a, ...b])];
console.log("並集=", union); //[1,2,3,4]

let intersect = [...new Set([...a].filter((x) => b.has(x)))];
console.log("交集=", intersect); //[2,3]

let difference = Array.from(new Set([...a].filter((x) => !b.has(x))));
console.log("差集=", difference); //[1]
複製代碼

五、WeakSet和Set的區別:

WeakSet和Set的區別:

  • 都是不可重複值的集合

  • 成員只能是對象

  • 沒有size屬性,不可遍歷

用處:

WeakSet的一個用處,是儲存DOM節點,而不擔憂這些節點從文檔移除時,會引起內存泄漏;

2、Map

一、概述

  • 本質上是健值對的集合,相似集合;

  • 傳統鍵值對都是「字符串-值」的對應,有所限制,因此Map結構提供了「值-值」的對應;

  • 能夠遍歷,能夠跟各類數據格式轉換

  • 接受一個數組做爲參數,數組成員是一個個表示鍵值對的數組;

  • Set和Map均可以生成新的Map;

  • 只有對同一個對象的引用,Map 結構纔將其視爲同一個鍵;

​ Map 的鍵其實是跟內存地址綁定的,只要內存地址不同,就視爲兩個鍵。

const map = new Map();
map.set(['aaa',5]);
console.log(map.get(['aaa']));//undefined

//只有對同一個對象的引用,Map 結構纔將其視爲同一個鍵;因此必需要指向同一個對象,將其存爲一個對象;
const map = new Map();
const k1 = ['aaa'];
map.set(k1,5);
console.log(map.get(k1));//5
複製代碼

二、屬性和方法

操做方法:

  • .set( )

  • .get( )

  • .delete( )

  • .has( )

  • .clear( )

遍歷方法:

  • .keys( ) 返回鍵名的遍歷器

  • .values( ) 返回鍵值的遍歷器

  • .entries( ) 返回全部成員的遍歷器

  • forEach( ) 遍歷Map的全部成員

Map的遍歷順序就是插入的順序

三、與其餘數據結構的互相轉換

(1)Map轉數組: 使用擴展運算符

(2)數組轉Map

(3)Map轉對象:Object.create( )

(4)對象轉Map:Object.entries( )

(5)Map轉JSON

(6)JSON轉Map

//一、Map轉數組
const map0 = new Map().set(1,'a').set(2,'b');
console.log(":",[...map0]);//[{1,'a'},{2,b}]
console.log("Map轉數組:",[...map0].keys());//[1,2]
console.log("Map轉數組:",[...map0].values());//['a','b']

//二、數組轉Map,將數組直接傳入Map構造函數
new Map([
[true,7],
[{foo:3},['abc]] ]) //三、Map轉對象 const map1 = new Map().set(1,'a').set(2,'b'); function strMapToObj(strMap){ let obj = Object.create(null);//建立一個空對象,這樣建立的對象乾淨,除了自身屬性以外沒有其餘屬性和方法 for(let [k,v] of strMap){ obj[k] = v; } return obj } strMapToObj(map1); //四、對象轉數組 const obj1 = {1:'a',2:'b'} let map2 = new Map(Object.entries(obj))//Object.entries()返回一個給定對象自身可枚舉屬性的鍵值對數組[['1','a'],['2','b']] 複製代碼

四、使用場景:

可使用數組的map和filter方法,Map自己是沒有map和filter方法的

(1)實現Map的過濾和遍歷

const map0 = new Map().set(1,'a).set(2,'b).set(3,'c');

const map1 = new Map([...map0].filter(([k,v])=>k < 3));
const map2 = new Map([...map0].map(([k,v])=>[k*2,'_'+v])) 
複製代碼

五、WeakMap和Map的區別

  • 只接受對象做爲鍵名(null除外);
  • WeakMap的鍵名所指的對象,是弱引用,即不會被計入垃圾回收機制;

​ (也就是說一旦不須要了,WeakMap裏面的鍵名對象和所對應的鍵值對就會自動消失,不用手動刪除)

​ (注意:弱引用的只是鍵名,而不是鍵值,鍵值依然是正常引用)

  • WeakMap的專用場合:

  • 它的鍵所對應的對象,可能會在將來消失。

  • WeakMap結構有助於防止內存泄漏。

在API上的區別:

  • 沒有遍歷操做,即沒有keys()、values()、entries()方法,也沒有size屬性;

  • 沒法清空,即不支持clear()方法,所以WeakMap只有set( )、get( )、has( )、delete( )方法;

學習資料:

ECMAScript 6 入門-Set 和 Map 數據結構

相關文章
相關標籤/搜索