溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ECMAScript 6.0中數(shù)據(jù)結(jié)構(gòu)的介紹和使用

發(fā)布時(shí)間:2020-06-22 17:25:50 來源:億速云 閱讀:227 作者:Leah 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)ECMAScript 6.0中數(shù)據(jù)結(jié)構(gòu)的介紹和使用,文章內(nèi)容質(zhì)量較高,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Set

Set 本身是一個(gè)構(gòu)造函數(shù),用來生成 Set 數(shù)據(jù)結(jié)構(gòu)。Set 函數(shù)可以接受一個(gè)數(shù)組(或者具有 iterable 接口的其他數(shù)據(jù)結(jié)構(gòu))作為參數(shù),用來初始化。Set 對象允許你存儲任何類型的值,無論是原始值或者是對象引用。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。

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
Set 中的特殊值

Set 對象存儲的值總是唯一的,所以需要判斷兩個(gè)值是否恒等。有幾個(gè)特殊值需要特殊對待:

  • +0 與 -0 在存儲判斷唯一性的時(shí)候是恒等的,所以不重復(fù)
  • undefinedundefined 是恒等的,所以不重復(fù)
  • NaNNaN 是不恒等的,但是在 Set 中認(rèn)為 NaNNaN 相等,所有只能存在一個(gè),不重復(fù)。
Set 的屬性:
  • size:返回集合所包含元素的數(shù)量
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5])
items.size // 5
Set 實(shí)例對象的方法
  • add(value):添加某個(gè)值,返回 Set 結(jié)構(gòu)本身(可以鏈?zhǔn)秸{(diào)用)。
  • delete(value):刪除某個(gè)值,刪除成功返回 true,否則返回 false。
  • 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
遍歷方法
  • keys():返回鍵名的遍歷器。
  • values():返回鍵值的遍歷器。
  • entries():返回鍵值對的遍歷器。
  • forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員。

由于 Set 結(jié)構(gòu)沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個(gè)值),所以 keys 方法和 values 方法的行為完全一致。

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"]
Array 和 Set 對比
  • ArrayindexOf 方法比 Sethas 方法效率低下
  • Set 不含有重復(fù)值(可以利用這個(gè)特性實(shí)現(xiàn)對一個(gè)數(shù)組的去重)
  • Set 通過 delete 方法刪除某個(gè)值,而 Array 只能通過 splice。兩者的使用方便程度前者更優(yōu)
  • Array 的很多新方法 map、filter、someevery 等是 Set 沒有的(但是通過兩者可以互相轉(zhuǎn)換來使用)
Set 的應(yīng)用

1、Array.from 方法可以將 Set 結(jié)構(gòu)轉(zhuǎn)為數(shù)組。

const items = new Set([1, 2, 3, 4, 5])
const array = Array.from(items)

2、數(shù)組去重

// 去除數(shù)組的重復(fù)成員
;[...new Set(array)]

Array.from(new Set(array))

3、數(shù)組的 mapfilter 方法也可以間接用于 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}

4、實(shí)現(xiàn)并集 (Union)、交集 (Intersect) 和差集

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}

weakSet

WeakSet 結(jié)構(gòu)與 Set 類似,也是不重復(fù)的值的集合。

  • 成員都是數(shù)組和類似數(shù)組的對象,若調(diào)用 add() 方法時(shí)傳入了非數(shù)組和類似數(shù)組的對象的參數(shù),就會拋出錯(cuò)誤。
const b = [1, 2, [1, 2]]
new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
  • 成員都是弱引用,可以被垃圾回收機(jī)制回收,可以用來保存 DOM 節(jié)點(diǎn),不容易造成內(nèi)存泄漏。
  • WeakSet 不可迭代,因此不能被用在 for-of 等循環(huán)中。
  • WeakSet 沒有 size 屬性。

Map

Map 中存儲的是 key-value 形式的鍵值對, 其中的 keyvalue 可以是任何類型的, 即對象也可以作為 keyMap 的出現(xiàn),就是讓各種類型的值都可以當(dāng)作鍵。Map 提供的是 “值-值”的對應(yīng)。

Map 和 Object 的區(qū)別
  1. Object 對象有原型, 也就是說他有默認(rèn)的 key 值在對象上面, 除非我們使用 Object.create(null)創(chuàng)建一個(gè)沒有原型的對象;
  2. Object 對象中, 只能把 StringSymbol 作為 key 值, 但是在 Map 中,key 值可以是任何基本類型(String, Number, Boolean, undefined, NaN….),或者對象(Map, Set, Object, Function , Symbol , null….);
  3. 通過 Map 中的 size 屬性, 可以很方便地獲取到 Map 長度, 要獲取 Object 的長度, 你只能手動(dòng)計(jì)算
Map 的屬性
  • size: 返回集合所包含元素的數(shù)量
const map = new Map()
map.set('foo', ture)
map.set('bar', false)
map.size // 2
Map 對象的方法
  • set(key, val): 向 Map 中添加新元素
  • get(key): 通過鍵值查找特定的數(shù)值并返回
  • has(key): 判斷 Map 對象中是否有 Key 所對應(yīng)的值,有返回 true,否則返回 false
  • delete(key): 通過鍵值從 Map 中移除對應(yīng)的數(shù)據(jù)
  • clear(): 將這個(gè) Map 中的所有元素刪除
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
遍歷方法
  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器
  • entries():返回鍵值對的遍歷器
  • forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員
const map = new Map([
  ['a', 1],
  ['b', 2],
])

for (let key of map.keys()) {
  console.log(key)
}
// "a"
// "b"

for (let value of map.values()) {
  console.log(value)
}
// 1
// 2

for (let item of map.entries()) {
  console.log(item)
}
// ["a", 1]
// ["b", 2]

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value)
}
// "a" 1
// "b" 2

// for...of...遍歷map等同于使用map.entries()

for (let [key, value] of map) {
  console.log(key, value)
}
// "a" 1
// "b" 2
數(shù)據(jù)類型轉(zhuǎn)化

Map 轉(zhuǎn)為數(shù)組

let map = new Map()
let arr = [...map]

數(shù)組轉(zhuǎn)為 Map

Map: map = new Map(arr)

Map 轉(zhuǎn)為對象

let obj = {}
for (let [k, v] of map) {
  obj[k] = v
}

對象轉(zhuǎn)為 Map

for( let k of Object.keys(obj)){
  map.set(k,obj[k])
}
Map的應(yīng)用

在一些 Admin 項(xiàng)目中我們通常都對個(gè)人信息進(jìn)行展示,比如將如下信息展示到頁面上。傳統(tǒng)方法如下。

<p class="info-item">
  <span>姓名</span>
  <span>{{info.name}}</span>
</p>
<p class="info-item">
  <span>年齡</span>
  <span>{{info.age}}</span>
</p>
<p class="info-item">
  <span>性別</span>
  <span>{{info.sex}}</span>
</p>
<p class="info-item">
  <span>手機(jī)號</span>
  <span>{{info.phone}}</span>
</p>
<p class="info-item">
  <span>家庭住址</span>
  <span>{{info.address}}</span>
</p>
<p class="info-item">
  <span>家庭住址</span>
  <span>{{info.duty}}</span>
</p>

js 代碼

mounted() {
  this.info = {
    name: 'jack',
    sex: '男',
    age: '28',
    phone: '13888888888',
    address: '廣東省廣州市',
    duty: '總經(jīng)理'
  }
}

我們通過 Map 來改造,將我們需要顯示的 label 和 value 存到我們的 Map 后渲染到頁面,這樣減少了大量的html代碼

<template>
  <p id="app">
    <p class="info-item" v-for="[label, value] in infoMap" :key="value">
      <span>{{label}}</span>
      <span>{{value}}</span>
    </p>
  </p>
</template>

js 代碼

data: () => ({
  info: {},
  infoMap: {}
}),
mounted () {
  this.info = {
    name: 'jack',
    sex: '男',
    age: '28',
    phone: '13888888888',
    address: '廣東省廣州市',
    duty: '總經(jīng)理'
  }
  const mapKeys = ['姓名', '性別', '年齡', '電話', '家庭地址', '身份']
  const result = new Map()
  let i = 0
  for (const key in this.info) {
    result.set(mapKeys[i], this.info[key])
    i++
  }
  this.infoMap = result
}

WeakMap

WeakMap 結(jié)構(gòu)與 Map 結(jié)構(gòu)類似,也是用于生成鍵值對的集合。

  • 只接受對象作為鍵名(null 除外),不接受其他類型的值作為鍵名
  • 鍵名是弱引用,鍵值可以是任意的,鍵名所指向的對象可以被垃圾回收,此時(shí)鍵名是無效的
  • 不能遍歷,方法有 getset、has、delete

總結(jié)

Set

  • 是一種叫做集合的數(shù)據(jù)結(jié)構(gòu)(ES6新增的)
  • 成員唯一、無序且不重復(fù)
  • [value, value],鍵值與鍵名是一致的(或者說只有鍵值,沒有鍵名)
  • 允許儲存任何類型的唯一值,無論是原始值或者是對象引用
  • 可以遍歷,方法有:add、delete、hasclear

WeakSet

  • 成員都是對象
  • 成員都是弱引用,可以被垃圾回收機(jī)制回收,可以用來保存 DOM 節(jié)點(diǎn),不容易造成內(nèi)存泄漏
  • 不能遍歷,方法有 add、delete、has

Map

  • 是一種類似于字典的數(shù)據(jù)結(jié)構(gòu),本質(zhì)上是鍵值對的集合
  • 可以遍歷,可以跟各種數(shù)據(jù)格式轉(zhuǎn)換
  • 操作方法有:set、get、has、delete、clear

WeakMap

  • 只接受對象作為鍵名(null 除外),不接受其他類型的值作為鍵名
  • 鍵名是弱引用,鍵值可以是任意的,鍵名所指向的對象可以被垃圾回收,此時(shí)鍵名是無效的
  • 不能遍歷,方法有 get、set、has、delete

以上就是ECMAScript 6.0中數(shù)據(jù)結(jié)構(gòu)的介紹和使用,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊,感謝各位的閱讀。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI