资讯专栏INFORMATION COLUMN

《Javascript数据结构和算法》笔记-「集合」

Donne / 3162人阅读

摘要:读书笔记实现集合目标学习如何创建集合,添加移除值搜索是否存在学习如何做并集交集差集的数据操作学习如何使用的类集合是无顺序不重复的的项组成的数据结构。

读书笔记-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));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108714.html

相关文章

  • JavaScript数据结构算法笔记——第6章 集合

    摘要:集合是由一组无序且唯一的的项组成的方法描述备注向集合添加一个新的项从集合移除一个项判断集合中是否存在某项移除集合中所有项返回集合中所有值组成的数组返回集合所包含元素的数量交集并集差集子集的实现差集对于给定的两个集合,返回一个包含所有存在于第 集合是由一组无序且唯一的的项组成的 function Set(){ let item = {}; this.has = funct...

    darcrand 评论0 收藏0
  • CSS技巧

    摘要:技巧使你的更加专业这是上关于技巧的一篇译文,另外你也可以在本项目看到原文。列举了一些很实用的技巧,比如给空内容的标签添加内容,逗号分隔列表等等。排序算法看源码,把它背下来吧排序算法的封装。主要帮助初学者更好的掌握排序算法的实现。 成为专业程序员路上用到的各种优秀资料、神器及框架 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 Java...

    DangoSky 评论0 收藏0
  • CSS技巧

    摘要:技巧使你的更加专业这是上关于技巧的一篇译文,另外你也可以在本项目看到原文。列举了一些很实用的技巧,比如给空内容的标签添加内容,逗号分隔列表等等。排序算法看源码,把它背下来吧排序算法的封装。主要帮助初学者更好的掌握排序算法的实现。 成为专业程序员路上用到的各种优秀资料、神器及框架 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 Java...

    zgbgx 评论0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:笔者作为一位,将工作以来用到的各种优秀资料神器及框架整理在此,毕竟好记性不如烂键盘,此前端知识点大百科全书前端掘金,,不定期更新技巧前端掘金技巧,偶尔更新。计算数组的极值技巧使你的更加专业前端掘金一个帮你提升技巧的收藏集。 CSS 样式画各种图形 - 前端 - 掘金下面是一些我在 CSS 中经常用到的图案,还有一些是在css-tricks看到的。记录一下,以后会用到。会持续更新… 一、...

    Jonathan Shieber 评论0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:笔者作为一位,将工作以来用到的各种优秀资料神器及框架整理在此,毕竟好记性不如烂键盘,此前端知识点大百科全书前端掘金,,不定期更新技巧前端掘金技巧,偶尔更新。计算数组的极值技巧使你的更加专业前端掘金一个帮你提升技巧的收藏集。 CSS 样式画各种图形 - 前端 - 掘金下面是一些我在 CSS 中经常用到的图案,还有一些是在css-tricks看到的。记录一下,以后会用到。会持续更新… 一、...

    SHERlocked93 评论0 收藏0

发表评论

0条评论

Donne

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<