说到集合,第一个想到的就是中学学到的那个数学概念:集合。在我们开始集合相关的js实现前,我们有必要来了解一下什么是集合以及集合的数学概念。

  好吧,我们一起来复习一下早就被我们遗忘的集合。

  集合是由一组无序且唯一的项组成的。集合这个数据结构使用了与有限集合相同的数学概念。在数学中,集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素。

  比如,一个包括0到9十个数字的集合表示为:N = {0,1,2,3,4,5,6,7,8,9}。集合中的对象列表用{}(大括号)包围。还有一个概念叫做空集,也就是该集合中不包含任何元素,也就是{},空集是任何集合的子集。

  除了集合的基本概念,还有一些简单的集合操作,比如并集、交集、差集和子集等。在后面会详细的介绍这些集合的操作。

  那么集合的数据概念就简单介绍完了。我们看看如何去创建一个集合类(set)。

function Set() {
let items = {};
}

  嗯,这就是set的骨架,哎??我记得好像ES6中就有set这个东东啊?嗯...是的,我们会在后面(下一篇)简单介绍下ES6原生的set类。

  这里我们使用对象而不是数组来表示集合。其实用数组也是可以的。那么是不是说,前面学过的栈和队列也都可以用对象来实现?是的,不要怀疑可行性。因为其实我们在改进这两个数据结构的时候用的就是weapMap这种ES6新增的结构。

  那么接下来要说一下set类有哪些可用的方法。

  1、add(value):向集合中添加一个新的项。

  2、delete(value):从集合移除一个值。

  3、has(value):如果值在集合中,返回true,否则返回false。

  4、clear():清空集合中的所有元素。

  5、size():返回集合所包含元素的数量。

  6、values():返回一个包含集合中所有值的数组。

function Set() {
let items = {};
//判断该set实例中是否存在该value
this.has = function (value) {
//检查它(或其原型链)上是否包含具有指定名称的属性的对象。但是in运算符会查找其原型链上的属性。所以我们用下面的方法更好
//return value in items;
//hasOwnProperty方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
//所以我们也可以用hasOwnProperty来判断一个对象的自身属性是否存在
return items.hasOwnProperty(value);
}
this.add = function (value) {
//通过我们上面写的has方法来判断这个值是否存在,如果不存在就添加进去,存在就返回false
if(!this.has(value)) {
items[value] = value;
return true;
}
return false;
}
//同样的道理,判断该set中是否有要删除的对象,如果有就删除,没有就返回false
this.remove = function (value) {
if(this.has(value)) {
delete items[value];
return true;
} return false;
}
//直接充值items为空,就变相的清空了items中的所有属性
this.clear = function() {
items = {};
}
//Object.keys是ES6中为对象新增的原生方法,它会返回一个数组,其中包含对象的所有元素,这样我们就可以获取其元素的个数了。
this.size = function () {
return Object.keys(items).length;
}
//上面我们用ES6新方法来获取items的长度,但是或许有些浏览器的兼容性不是很好。所以我们也可以用循环遍历计数的方式来完成这个功能
this.sizeLegacy = function () {
let count = 0;
for(let key in items) {
if(items.hasOwnProperty(key))
++count;
}
return count;
} this.values = function () {
let values = [];
for(let i = 0,keys = Object.keys(items);i < keys.length; i++) {
values.push(items[keys[i]]);
}
return values;
} this.valuesLegacy = function () {
let values = [];
for(let key in items) {
if(items.hasOwnProperty(key)) {
values.push(items[key])
}
}
return values;
} } var set = new Set();
set.add(1);
console.log(set.values());//[1]
set.add(2);
console.log(set.values());//[1, 2]
console.log(set.size());//
set.remove(2);
console.log(set.values());//[1]

  这样我们就完整的实现了我们自定义的set类,发没发现我的注释越来越少了,越到后面的学习也就越简单了。因为其实很多东西都是类似的,有它共同的point。

  好了,集合的实现我们已经完成了。下一篇文章会介绍一下集合的几种操作方法以及ES6原生set的一些简单用法介绍。

  

  最后,由于本人水平有限,能力与大神仍相差甚远,若有错误或不明之处,还望大家不吝赐教指正。非常感谢!

用js来实现那些数据结构09(集合01-集合的实现)的更多相关文章

  1. 用js来实现那些数据结构(栈01)

    其实说到底,在js中栈更像是一种变种的数组,只是没有数组那么多的方法,也没有数组那么灵活.但是栈和队列这两种数据结构比数组更加的高效和可控.而在js中要想模拟栈,依据的主要形式也是数组. 从这篇文章开 ...

  2. 用js来实现那些数据结构—目录

    首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做<学习JavaScript数据结构和算法>(第二版),人民邮电出版社出版的这本书.github ...

  3. 用js来实现那些数据结构及算法—目录

    首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做<学习JavaScript数据结构和算法>(第二版),人民邮电出版社出版的这本书.github ...

  4. js前台取用后台传递过来的map集合方式

    在处理有些特殊需求的时候,我们需要在前台页面的js中获取后台传递过来的map集合类型的参数,并且进行调用,代码如下: 在后台我们拼装出如下的集合: Map<String,Grade> gr ...

  5. (js描述的)数据结构 [数组的一些补充](1)

    (js描述的)数据结构 [数组的一些补充](1) 1. js的数组: 1.优点:高度封装,对于数组的操作就是调用API 2.普通语言的数组: 1.优点:根据index来查询,修改数据效率很高 2.缺点 ...

  6. D3.js的基础部分之数组的处理 集合(Set)(v3版本)

    数组的处理 之 集合(set) 集合(Set)是数学中常用的概念,表示具有某种特定性质的事物的总体.集合里的项叫做元素.集合的相关方法有:   d3.set([array]) //使用数组来构建集合, ...

  7. java数据结构和算法01(数组的简单使用)

    一直都对这一块没有什么想法,加上不怎么理解,只是懂个大概:最近突然感觉对数据结构和算法这块有点儿兴趣,决定还是尽量详细的看看这些结构和算法: 话说什么事数据结构和算法呢?现在我也说不上来,等我学的差不 ...

  8. 集合_java集合框架

    转载自http://blog.csdn.net/zsw101259/article/details/7570033 Java集合框架图 简化图: Java平台提供了一个全新的集合框架.“集合框架”主要 ...

  9. Java 集合学习--集合概述

    一.集合框架 集合,通常也叫容器,java中有多种方式保存对象,集合是java保存对象(对象的引用)的方式之一,之前学习的数组是保存对象的最有效的方式,但是数组却存在一个缺陷,数组的大小是固定的,但是 ...

随机推荐

  1. 常用排序算法的Java实现与分析

    由于需要分析算法的最好时间复杂度和最坏时间复杂度,因此这篇文章中写的排序都是从小到大的升序排序. 带排序的数组为arr,arr的长度为N.时间复杂度使用TC表示,额外空间复杂度使用SC表示. 好多代码 ...

  2. Property 'id' not found on type java.lang.String

    改为 忘写了$符,取不出来,因此报错!

  3. Maven安装配置【WIN10】

    环境 WIN10 Maven 3.5.3 下载 下载地址:https://maven.apache.org/download.cgi 安装配置 选择好路径后一路 next 默认,安装完成. 环境变量设 ...

  4. SUN平台服务器光纤共享存储互斥失败如何恢复数据?

    服务器数据恢复故障描述: 服务器最初的设计思路为将两台SPARC SOLARIS系统通过光纤交换机共享同一存储作为CLUSTER使用,正常情况下A服务器工作,当A服务器发生故障宕机后即可将其关机然后开 ...

  5. New UWP Community Toolkit - ImageEx

    概述 UWP Community Toolkit  中有一个图片的扩展控件 - ImageEx,本篇我们结合代码详细讲解  ImageEx 的实现. ImageEx 是一个图片的扩展控件,包括 Ima ...

  6. $(function(){})和window.onload的区别

    (1)$(function(){}):DOM节点创建 完成才执行 (2)window.onload:页面所有资源(JS/CSS)加载完成才执行

  7. EasyUI中DataGrid隔行改变背景颜色。

    <table id="dg" class="easyui-datagrid" style="width: 1000px; height: 300 ...

  8. Web Api HttpWebRequest 请求 Api 及 异常处理

    HttpWebRequest request = WebRequest.CreateHttp(url); request.Method = "post"; request.Head ...

  9. MySQL 避免重复数据的批量插入与批量更新

    [转发] 导读 我们在向数据库里批量插入数据的时候,会遇到要将原有主键或者unique索引所在记录更新的情况,而如果没有主键或者unique索引冲突的时候,直接执行插入操作. 这种情况下,有三种方式执 ...

  10. 新概念英语(1-27)Mrs. Smtih's living room

    Where are the books? Mrs. Smtih's living room is large. There is a television in the room. The telev ...