Javascriptのデータ構造とアルゴリズムの学習(四) - のコレクション

コレクションとは何ですか?

データ構造の見直しの前に:スタック、キュー、リンクリスト-彼らは達成するためのJSの配列を使用して、ターゲット・キーと比較して、オブジェクトの集合への依存度を達成することができます:コレクションの構造、キーと値の値は、実際には同じですその{1:1,2:2,'a':'a'}この種類。ES6のための参照設定データ構造

  • 特長:
    1. いいえ繰り返しません:各要素が相互に排他的です
    2. 障害:コレクション、貴重によって各位置が同じで、要素間乱れています。
    3. コレクションで表現JS:オブジェクト

操作セットの方法

  • あるかどうか:持っている(値)
  • 削除:削除(値)
  • (値)を追加:追加
  • インデックス:のindexOf()
  • クリア:クリア()
  • 全長サイズ:サイズ
function SetClass(){
    var items= {}
    this.has = function(val){
        return items.hasOwnProperty(val)
    }
    this.add = function(val){
        if(!this.has(val)){
            items[val]=val; // 以值 为key
            return val
        }
        return false
    }
    this.remove = function (value){
        if(!this.has(value)){
            delete items[value]
            return true;
        }
        return false;
    }
    this.clear=function(){
        items = {}
    }
    this.size = function(){
        return Object.keys(items).length;
    }
    this.values = function(){
        var values = []
        for(let key in items){
            if(items.hasOwnProperty(items[i])){
                values.push(items[i])
            }
        }
        return values
    }
    this.print = function(){
        console.log(items)
    }
} 

コレクション間の操作

ここに画像を挿入説明

  • 組合:組合
  • 交差点:交差点
  • 差集:違い

組合

ここに画像を挿入説明

 this.union = function (otherSet){
       var resSet = new SetClass()
       var arr = this.values()
       for(let i=0;i<arr.length;i++){
           resSet.add(arr[i])
       }
       arr = otherSet.values()
       for(let i=0;i<arr.length;i++){
           resSet.add(arr[i])
       }
       return resSet
   }

交差点

this.intersection = function(otherSet){
        var resSet = new SetClass()
        var arr = this.values()
        for(let i=0;i<arr.length;i++){
            if(!otherSet.has(arr[i])){
                resSet.add(arr[i])
            }
        }
        return resSet
    }

差分セット

 this.differenct = function(otherSet){
        var resSet = new SetClass()
        let values = this.values()
        for(let i=0;i<values.length;i++){
            if(!otherSet.has(values[i])){
                resSet.add(values[i])
            }
        }
        return resSet
    }

ES6は、新しいデータ構造を構築しました

  • セット:コレクション
  • WeakSet:弱いコレクションは、オブジェクト型の要素として値を追加することができます

関連APIオペレーション
ここに画像を挿入説明

var set = new Set(([1,2,3]))
set.forEach((key,value,set)=>{
    console.log('key---',key)
    console.log('value---',value)
    console.log(set)
})

var weakSet = new WeakSet()
weakSet.add('1') //报错
weakSet.add({name:'a'})

ES6は交差点、労働組合、違いを実感します

var set1 = new Set(([1,2,3]))
var set2 =new Set([2,3,4])

// 交集
var intersect = new Set([...set1].filter(item=>set2.has(item)))
// 差集
var different = new Set([...set2].filter(item=>!set1.has(item)))
// 并集
var union = new Set([...set1,...set2])

違いを設定し、WeakSet

  • 強い参照を設定し、弱参照をWeakSet
    ここに画像を挿入説明

上記、オブジェクトobjに可変ポインティングを宣言は{name:''ceshi}、オブジェクトがGCに回収されないので、OBJは、元のオブジェクトの元のセット強い基準点の構造ので、この時点で、OBJヌル点を変更するために、設定された構成に追加されます間接参照にした後、オブジェクトを削除set.delete使用するまでメモリに残ります。weakSetがOBJ指し後に変更され、元のオブジェクトを直接GCを再循環さweakset弱参照を無視します

  • シナリオ:開発、使用することは、より自動化のいくつかのメモリのより柔軟な管理をweakSet。

A ES6フェイス質問

のセット、地図、WeakSetとWeakMapを区別するために導入?

  • セットする:
    • メンバーは繰り返すことはできません
    • 唯一のキー、キーなしの名前
    • あなたは、メソッドの追加、削除トラバース、持っていることができます
  • WeakSet:
    • メンバーが対象となります
    • メンバーは、弱参照されている任意の時点で消えることができ、DOMノードを保存するために使用することができ、それはメモリリークが発生する可能性は低いです
  • 地図:
    • それは本質的にセットに似たキーと値のペアのコレクションです。これは非文字列.Objectキー名、キーと値のペア「キー」であってもよいが、実際に文字列であり、かつ価値の主要地図他のタイプかもしれません。
    • あなたは、横断できます
  • WeakMap:
  • 唯一のキーとして他の種類の値を受け入れない、(ヌル以外)キーなどのオブジェクトを受け入れます
  • オブジェクトへのキーポイントは、ガベージコレクションに含まれていません
  • トラバース、方法は、セットを取得することはできません、削除しました
114元記事公開 ウォンの賞賛146 ビューに25万+を

おすすめ

転載: blog.csdn.net/Sophie_U/article/details/103810451