目次
Set
Array.from
は、キーと値のペアを
Map 和 Object 的区别
Map 的属性
Map 对象的方法
遍历方法
数据类型转化
Map的应用
WeakMap
总结
ホームページ ウェブフロントエンド jsチュートリアル ES6 Set、WeakSet、Map、WeakMap を理解します。

ES6 Set、WeakSet、Map、WeakMap を理解します。

Jun 20, 2020 am 09:43 AM
es6 javascript フロントエンド

以前 ES6 を学習していたときに、SetMap を目にしました。それらのアプリケーション シナリオが何であるかは知りませんでした。ただ、配列の重複排除でよく使用されるものだと思っていました。その後、Set はセットと呼ばれるデータ構造であり、Map は辞書と呼ばれるデータ構造であることに徐々に気づきました。

この記事は gitthub に含まれています: github.com/Michael-lzg…

Set

Set 自体は ## を生成するために使用されるコンストラクターです#Set データ構造。 Set この関数は、配列 (または反復可能なインターフェイスを備えた他のデータ構造) を初期化用のパラメーターとして受け入れることができます。 Set オブジェクトを使用すると、プリミティブ値であってもオブジェクト参照であっても、あらゆるタイプの値を格納できます。配列に似ていますが、メンバーの値は一意であり、重複する値はありません。

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 オブジェクトに格納される値は常に一意であるため、2 つの値が一致するかどうかを判断する必要があります。は同じ。特別な処理が必要な特別な値がいくつかあります。

    0 と -0 は、格納および一意性の判断時に同一であるため、繰り返されません。
  • 未定義 unknown と同一であるため、繰り返されません。
  • NaNNaN と同一ではありませんが、 SetNaNNaN と等しいとみなし、重複せずに存在できるのは 1 つだけです。
セットの属性:

  • size: セットに含まれる要素の数を返します
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5])
items.size // 5
ログイン後にコピー
Setインスタンス オブジェクト メソッド

    ##add(value)
  • : 特定の値を追加し、Set 構造自体を返します (チェーンで呼び出すことができます)。
  • delete(value)
  • : 特定の値を削除します。削除が成功した場合は true が返され、そうでない場合は false が返されます。 。
  • has(value)
  • : 値が 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
    ログイン後にコピー
  • Traversal メソッド

    keys()
  • : キー名のトラバーサーを返します。
  • values()
  • : キー値のトラバーサを返します。
  • entries()
  • : キーと値のペアのトラバーサーを返します。
  • forEach()
  • : コールバック関数を使用して各メンバーを走査します。
Set

構造体にはキー名がなく、キー値のみ (またはキー名とキー値が同じ値) があるため、keys メソッドvalues メソッドとまったく同じように動作します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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) } // [&quot;red&quot;, &quot;red&quot;] // [&quot;green&quot;, &quot;green&quot;] // [&quot;blue&quot;, &quot;blue&quot;]</pre><div class="contentsignin">ログイン後にコピー</div></div>Array と Set の比較

    Array
  • indexOf メソッドは Set のメソッドよりも優れていますhas このメソッドは非効率です
  • Set
  • には重複した値が含まれていません (この機能を使用して配列の重複排除を実現できます)
  • Set
  • Passdelete メソッドは値を削除しますが、Arraysplice を介してのみ渡すことができます。
  • Array
  • には、多くの新しいメソッド mapfilter があります。 someevery などは Set では使用できません (ただし、相互に変換して使用できます)
  • Set## の応用
#1,

Array.from

メソッドは、

Set 構造体を配列に変換できます。

const items = new Set([1, 2, 3, 4, 5])
const array = Array.from(items)
ログイン後にコピー
2. 配列の重複排除
// 去除数组的重复成员
;[...new Set(array)]

Array.from(new Set(array))
ログイン後にコピー
3. 配列の

map

メソッドと

filter メソッドは、Set に対して間接的に使用することもできます。

let set = new Set([1, 2, 3])
set = new Set([...set].map((x) => x * 2))
// 返回Set结构:{2, 4, 6}

let set = new Set([1, 2, 3, 4, 5])
set = new Set([...set].filter((x) => x % 2 == 0))
// 返回Set结构:{2, 4}
ログイン後にコピー
4. Union(Union)、intersect

(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

Set

と同様の構造を持ち、これも一意の値のコレクションです。 メンバーはすべて配列および配列のようなオブジェクトです。配列および配列のようなオブジェクトではないパラメーターを指定して add()

メソッドを呼び出すと、エラーが発生します。投げられた。
  • const b = [1, 2, [1, 2]]
    new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
    ログイン後にコピー
    メンバーは弱参照であり、ガベージ コレクション メカニズムによってリサイクルできます。DOM ノードの保存に使用でき、メモリ リークが発生しにくいです。
    WeakSet
  • は反復可能ではないため、
  • for-of
  • などのループでは使用できません。 WeakSet には
  • size
  • プロパティがありません。 Map
Map

は、キーと値のペアを

key-value

の形式で保存します。ここで、key value は任意のタイプにすることができます。つまり、オブジェクトは key としても使用できます。 Map の登場により、さまざまなタイプの値をキーとして使用できるようになります。 Map は、「値と値」の対応を提供します。 <h4 id="Map-和-Object-的区别">Map 和 Object 的区别</h4> <ol> <li> <code>Object 对象有原型, 也就是说他有默认的 key 值在对象上面, 除非我们使用 Object.create(null)创建一个没有原型的对象;

  • Object 对象中, 只能把 StringSymbol 作为 key 值, 但是在 Map 中,key 值可以是任何基本类型(String, Number, Boolean, undefined, NaN….),或者对象(Map, Set, Object, Function , Symbol , null….);
  • 通过 Map 中的 size 属性, 可以很方便地获取到 Map 长度, 要获取 Object 的长度, 你只能手动计算
  • Map 的属性

    • size: 返回集合所包含元素的数量
    const map = new Map()
    map.set('foo', ture)
    map.set('bar', false)
    map.size // 2
    ログイン後にコピー

    Map 对象的方法

    • set(key, val): 向 Map 中添加新元素
    • get(key): 通过键值查找特定的数值并返回
    • has(key): 判断 Map 对象中是否有 Key 所对应的值,有返回 true,否则返回 false
    • delete(key): 通过键值从 Map 中移除对应的数据
    • clear(): 将这个 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():使用回调函数遍历每个成员
    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
    ログイン後にコピー

    数据类型转化

    Map 转为数组

    let map = new Map()
    let arr = [...map]
    ログイン後にコピー

    数组转为 Map

    Map: map = new Map(arr)
    ログイン後にコピー

    Map 转为对象

    let obj = {}
    for (let [k, v] of map) {
      obj[k] = v
    }
    ログイン後にコピー

    对象转为 Map

    for( let k of Object.keys(obj)){
      map.set(k,obj[k])
    }
    ログイン後にコピー

    Map的应用

    在一些 Admin 项目中我们通常都对个人信息进行展示,比如将如下信息展示到页面上。传统方法如下。

    <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>手机号</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: '总经理'
      }
    }
    ログイン後にコピー

    我们通过 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: '总经理'
      }
      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 结构与 Map 结构类似,也是用于生成键值对的集合。

    • 只接受对象作为键名(null 除外),不接受其他类型的值作为键名
    • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
    • 不能遍历,方法有 getsethasdelete

    总结

    Set

    • 是一种叫做集合的数据结构(ES6新增的)
    • 成员唯一、无序且不重复
    • [value, value],键值与键名是一致的(或者说只有键值,没有键名)
    • 允许储存任何类型的唯一值,无论是原始值或者是对象引用
    • 可以遍历,方法有:adddeletehasclear

    WeakSet

    • 成员都是对象
    • 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏
    • 不能遍历,方法有 adddeletehas

    Map

    • 是一种类似于字典的数据结构,本质上是键值对的集合
    • 可以遍历,可以跟各种数据格式转换
    • 操作方法有:setgethasdeleteclear

    WeakMap

    • 只接受对象作为键名(null 除外),不接受其他类型的值作为键名
    • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
    • 不能遍历,方法有 getsethasdelete

    推荐教程:《JS教程

    以上がES6 Set、WeakSet、Map、WeakMap を理解します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

    WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

    PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ Mar 16, 2024 pm 12:09 PM

    PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ 今日のインターネットの急速な発展の時代において、フロントエンド開発はますます重要になっています。 Web サイトやアプリケーションのエクスペリエンスに対するユーザーの要求がますます高まっているため、フロントエンド開発者は、より効率的で柔軟なツールを使用して、応答性の高いインタラクティブなインターフェイスを作成する必要があります。フロントエンド開発の分野における 2 つの重要なテクノロジーである PHP と Vue.js は、組み合わせることで完璧なツールと見なされます。この記事では、PHP と Vue の組み合わせと、読者がこれら 2 つをよりよく理解し、適用できるようにするための詳細なコード例について説明します。

    フロントエンドの面接官からよく聞かれる質問 フロントエンドの面接官からよく聞かれる質問 Mar 19, 2024 pm 02:24 PM

    フロントエンド開発のインタビューでは、HTML/CSS の基本、JavaScript の基本、フレームワークとライブラリ、プロジェクトの経験、アルゴリズムとデータ構造、パフォーマンスの最適化、クロスドメイン リクエスト、フロントエンド エンジニアリング、デザインパターン、新しいテクノロジーとトレンド。面接官の質問は、候補者の技術スキル、プロジェクトの経験、業界のトレンドの理解を評価するように設計されています。したがって、候補者はこれらの分野で自分の能力と専門知識を証明するために十分な準備をしておく必要があります。

    JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

    JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

    簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

    JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

    Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Jan 19, 2024 am 08:37 AM

    Django は、迅速な開発とクリーンなメソッドを重視した Python で書かれた Web アプリケーション フレームワークです。 Django は Web フレームワークですが、Django がフロントエンドなのかバックエンドなのかという質問に答えるには、フロントエンドとバックエンドの概念を深く理解する必要があります。フロントエンドはユーザーが直接対話するインターフェイスを指し、バックエンドはサーバー側プログラムを指し、HTTP プロトコルを通じてデータと対話します。フロントエンドとバックエンドが分離されている場合、フロントエンドとバックエンドのプログラムをそれぞれ独立して開発して、ビジネス ロジックとインタラクティブ効果、およびデータ交換を実装できます。

    Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Mar 28, 2024 pm 01:06 PM

    Go 言語は、高速で効率的なプログラミング言語として、バックエンド開発の分野で広く普及しています。ただし、Go 言語をフロントエンド開発と結びつける人はほとんどいません。実際、フロントエンド開発に Go 言語を使用すると、効率が向上するだけでなく、開発者に新たな視野をもたらすことができます。この記事では、フロントエンド開発に Go 言語を使用する可能性を探り、読者がこの分野をよりよく理解できるように具体的なコード例を示します。従来のフロントエンド開発では、ユーザー インターフェイスの構築に JavaScript、HTML、CSS がよく使用されます。

    Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Jan 19, 2024 am 08:52 AM

    Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django は、効率的でスケーラブルな Web アプリケーション フレームワークです。 MVCやMTVなど複数のWeb開発モデルをサポートし、高品質なWebアプリケーションを簡単に開発できます。 Django はバックエンド開発をサポートするだけでなく、フロントエンド インターフェイスを迅速に構築し、テンプレート言語を通じて柔軟なビュー表示を実現します。 Django はフロントエンド開発とバックエンド開発をシームレスに統合するため、開発者は学習に特化する必要がありません。

    See all articles