集合的javascript實現(xiàn)

集合是由一組無序且唯一(即不能重復)的項組成的睁搭。這個數(shù)據(jù)結構使用了與有限集合相同的數(shù)學概念,但應用在計算機科學的數(shù)據(jù)結構中。ES6也有原生Set類的實現(xiàn)。集合李包含下面這些方法:has乐埠、add、remove、clear丈咐、size瑞眼、values。同時兩個集合之間還會有這些操作:并集(union)扯罐、交集(interaction)负拟、差集(difference)、子集(subset)歹河。

Set類的實現(xiàn)

function MySet(){
  let items={}

  this.has=function(value){
    return items.hasOwnProperty(value)
  }

  this.add=function(value){
    if(this.has(value)){
      items[value]=value
      return true
    }
    return false
  }

  this.remove=function(value){
    if(this.has(value)){
      delete items[value]
      return true
    }
    return false
  }

  this.clear=function(){
    items={}
  }

  this.size=function(){
    let keys=Object.keys(items)
    return keys.length
  }

  this.values=function(){
    let keys=Object.keys(items)
    return keys.map(key=>items[key])
  }

  this.union=function(otherSet){ // 并集
    let unionSet=new MySet()

    let values=this.values()
    for(let i=0;i<values.length;i++){
      unionSet.add(values[i])
    }

    values=otherSet.values()
    for(let i=0;i<values.length;i++){
      unionSet.add(values[i])
    }

    return unionSet
  }

  this.intersection=function(otherSet){ // 交集
    let intersectionSet=new MySet()

    let values=this.values()
    for(let value of values){
      if(otherSet.has(value)){
        intersectionSet.add(value)
      }
    }

    return intersectionSet
  }

  this.difference=function(otherSet){ // 差集
    let differenceSet=new MySet()
    
    let values=this.values()
    for(let value of values){
      if(!otherSet.has(value)){
        differenceSet.add(value)
      }
    }

    return differenceSet
  }

  this.subset=function(otherSet){ // 子集
    if(this.size()>otherSet.size()){
      return false
    }else{
      let values=this.values()
      for(let i=0;i<values.length;i++){
        if(!otherSet.has(values[i])){
          return false
        }
      }
      return true
    }
  }
}

ES6 Set類的擴展

ES6實現(xiàn)了原生的Set類,不過它是基于數(shù)組的花吟。因此創(chuàng)建一個實例是這樣:new Set(arr)秸歧。Set類里基本也包含了上面的一些方法,但是沒有類之間的操作衅澈。下面在原生的Set類基礎上實現(xiàn)擴展键菱。

Set.prototype.union=function(otherSet){
  let unionSet=new Set()
  for(let x of this){
    unionSet.add(x)
  }
  for(let x of otherSet){
    unionSet.add(x)
  }

  return unionSet
}

Set.prototype.intersection=function(otherSet){
  let intersectionSet=new Set()
  for (let x of this){
    if(otherSet.has(x)){
      intersectionSet.add(x)
    }
  }
  return intersectionSet
}

Set.prototype.difference=function(otherSet){
  let differenceSet=new Set()
  for(let x of this){
    if(!otherSet.has(x)){
      differenceSet.add(x)
    }
  }
  return differenceSet
}

Set.prototype.subset=function(otherSet){
  if(this.size<otherSet.size){
    return false
  }
  for(let x of this){
    if(!otherSet.has(x)){
      return false
    }
  }
  return true
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市今布,隨后出現(xiàn)的幾起案子经备,更是在濱河造成了極大的恐慌,老刑警劉巖部默,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侵蒙,死亡現(xiàn)場離奇詭異,居然都是意外死亡傅蹂,警方通過查閱死者的電腦和手機纷闺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來份蝴,“玉大人犁功,你說我怎么就攤上這事』榉颍” “怎么了浸卦?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長案糙。 經常有香客問我限嫌,道長,這世上最難降的妖魔是什么侍筛? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任萤皂,我火速辦了婚禮,結果婚禮上匣椰,老公的妹妹穿的比我還像新娘裆熙。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布入录。 她就那樣靜靜地躺著蛤奥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僚稿。 梳的紋絲不亂的頭發(fā)上凡桥,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音蚀同,去河邊找鬼缅刽。 笑死,一個胖子當著我的面吹牛蠢络,可吹牛的內容都是我干的衰猛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼刹孔,長吁一口氣:“原來是場噩夢啊……” “哼啡省!你這毒婦竟也來了?” 一聲冷哼從身側響起髓霞,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卦睹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后方库,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體结序,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年薪捍,在試婚紗的時候發(fā)現(xiàn)自己被綠了笼痹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡酪穿,死狀恐怖凳干,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情被济,我是刑警寧澤救赐,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站只磷,受9級特大地震影響经磅,放射性物質發(fā)生泄漏。R本人自食惡果不足惜钮追,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一预厌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧元媚,春花似錦轧叽、人聲如沸苗沧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽待逞。三九已至,卻和暖如春网严,著一層夾襖步出監(jiān)牢的瞬間识樱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工震束, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怜庸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓驴一,卻偏偏與公主長得像休雌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肝断,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容