es6學習之Set和Map結構

一.Set結構

Set結構是類似於數組結構,但是成員都是不重複的值(判斷不重複類似Object.is()方法,但是+0和-0又是相同的處理,Object.is(+0,-0); // false)

缺點是沒辦法像數組一樣通過下標取值的方法.

WeekSet結構和Set相似,但是成員只能是對象,且對象是弱引用(成員中的對象不存在了,在本結構中也就不存在了),重點是沒有size屬性,沒有遍歷接口

1.構造

任何具有Iterator接口的數據結構都能作爲new Set的參數

let set = new Set([1,2,3]);
set.size    // 3

2.屬性和方法

(1)屬性

Set.prototype.constructor 構造函數,就是set本身
Set.prototype.size set的成員總數

(2)操作方法

  • add(value) 添加值,返回添加後set本身
  • delete(value) 刪除某個值,返回Boolean,是否刪除成功
  • has(value) 是否含有某一個值,返回Boolean,是否有這個值
  • clear() 請求所有成員,void
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);  // true
s.has(2) // false

(3)遍歷方法

  • keys() 返回鍵名的遍歷器
  • values() 返回鍵值的遍歷器
  • entries() 返回鍵值對的遍歷器
  • forEach() 使用回掉函數遍歷每一個set成員
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"]

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

3.應用

(1)數組去重

let arr = [1,2,3,4,5,4,23,1,3];
arr= Array.from(new Set(arr));  // [1, 2, 3, 4, 5, 23]

(2)擴展運算符解構set

let arr = [1,2,3,4,5,4,23,1,3];
let set = new Set(arr);
let arr4 = [...set];    // [1, 2, 3, 4, 5, 23]

(3)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結構

Map結構是鍵值對集合(Hash結構).Map可以使用對象作爲鍵名.map內部的鍵名的重複檢測和Set相同
WeekMap結構類似Map,區別是鍵名只能是對象,且對象是弱引用,類似於WeekSet的弱引用

1.構造

任何具有Iterator接口的數據結構都能被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"

2.屬性和方法

(1)屬性

Map.prototype.size Map的成員數量

(2)操作方法

  • set(key,value) 向map設置一個值,已有鍵名的會被覆蓋,否則會新建,返回設置後的map
  • get(key) 讀取key對應的鍵值,沒有則返回undefined
  • has(key) 查找map中有沒有某個鍵名,返回Boolean
  • clear() 清楚所有成員,void

(3)遍歷方法

和Set擁有同樣的遍歷方法

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value);
}
// "no"
// "yes"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

// 等同於使用map.entries()
for (let [key, value] of map) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

map.forEach(function(value, key, map) {
  console.log("Key: %s, Value: %s", key, value);
});

3.應用

暫無

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章