博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Javascript数据结构和算法》笔记-「集合」
阅读量:5867 次
发布时间:2019-06-19

本文共 3500 字,大约阅读时间需要 11 分钟。

读书笔记-JavaScript实现「集合」

目标

  • 学习如何创建集合,添加、移除值、搜索是否存在
  • 学习如何做并集、交集、差集的数据操作
  • 学习如何使用 ES6 的 Set 类

集合是无顺序、不重复的的项组成的数据结构。与数学中的有限集合是通过一个概念

ES6 原生的 Set 就是「集合」,原生的 Map 就是「字典」

6.2 实现与 ES6 的 Set 相似的一个集合结构

function Set() {    let items = {};    this.has = function(value) {        // 根据in操作符不同,hasOwenProperty只检测自有属性,忽略原型链        return items.hasOwnProperty(value);    };    this.add = function(value) {        if (!this.has(value)) {            items[value] = value;            return true;        } else {            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() {        return Object.values(items);    };    // 并集操作    this.union = function(otherSet) {        let unionSet = new Set();        this.values().forEach(value => {            unionSet.add(value);        });        // 因为add时,会用has判断,是否重复的元素不再push        otherSet.values().forEach(value => {            unionSet.add(value);        });        return unionSet;    };    // 交集操作    this.intersection = function(otherSet) {        let intersectionSet = new Set();        this.values().forEach(value => {            if (otherSet.has(value)) {                unionSet.add(value);            }        });        return intersectionSet;    };    // 判断A是否是B的子集    this.subset = function(otherSet) {        return this.values().every(value => {            return otherSet.has(value);        });    };}

试一试,代码能否正常运行

let set = new Set();set.add(1);console.log(set.values());console.log(set.has(1));console.log(set.size());set.add(2);console.log(set.values());console.log(set.has(2));console.log(set.size());set.remove(1);console.log(set.values());set.remove(2);console.log(set.values());

拓展集合操作 并集、交集、差集

并集操作
// 并集操作this.union = function(otherSet) {    let unionSet = new Set();    this.values().forEach(value => {        unionSet.add(value);    });    // 因为add时,会用has判断,是否重复的元素不再push    otherSet.values().forEach(value => {        unionSet.add(value);    });    return unionSet;};

试一试,代码做了并集操作

let set1 = new Set();set1.add(1);let set2 = new Set();set1.add(2);console.log(set1.union(set2).values());
交集操作
this.intersection = function(otherSet) {    let intersectionSet = new Set();    this.values().forEach(value => {        if (otherSet.has(value)) {            unionSet.add(value);        }    });    return intersectionSet;};

试一试,是否实现了交集操作

let set1 = new Set();set1.add(1);set1.add(2);let set2 = new Set();set2.add(2);console.log(set1.values());console.log(set2.values());console.log(set1.intersection(set2).values());
差集操作
// 差集this.difference = function(otherSet) {    let differenceSet = new Set();    this.values().forEach(value => {        if (!otherSet.has(value)) {            differenceSet.add(value);        }    });    return differenceSet;};

试一试,是否实现了差集操作

let set1 = new Set();set1.add(1);set1.add(2);let set2 = new Set();set2.add(2);console.log(set1.values());console.log(set2.values());console.log(set1.difference(set2).values());
判断是否是子集的操作
// 判断是否是子集的操作this.subset = function(otherSet) {    return this.values().every(value => {        return otherSet.has(value);    });};

试一试,是否实现了判断子集操作

let set1 = new Set();set1.add(1);let set2 = new Set();set2.add(1);set2.add(2);console.log(set1.values());console.log(set2.values());console.log(set1.subset(set2));

转载地址:http://jonnx.baihongyu.com/

你可能感兴趣的文章
Linux 网络配置
查看>>
第一天
查看>>
图说:Windows 8中Hyper-V安装虚拟机操作系统(以Win XP为例)
查看>>
我的友情链接
查看>>
ubuntu 安装ssh
查看>>
Linux运维第三阶段(十)POSTFIX
查看>>
CISCO MPLS ×××
查看>>
洛谷——P1262 间谍网络
查看>>
RealVnc远程登陆
查看>>
数据排序 第三讲( 各种排序方法 结合noi题库1.10)
查看>>
研究下skynet,云风大神的开源框架
查看>>
中国白领加班城市排行榜:杭州最多
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
文件系统的影响
查看>>
世界上第一个站点 http://info.cern.ch/
查看>>
启发式测试策略模型(Heuristic Test Strategy Model,简称HTSM)
查看>>
RHEL 6.0 +Cluster+oracle11g 实施问题小结
查看>>
下一步怎么办?核心网带宽必须迅猛增长!
查看>>
安装grid的时候遇到的错误INS-20802
查看>>