集合类似于数组,但是集合中的元素是唯一的,没有重复值的。就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算。在ECMA6之前,JavaScript没有提供原生的Set类,所以只能手动实现,不过手动实现的好处在于,帮助我们了解集合的原理。关于Redis集合的应用,你可以移步到这篇文章Redis命令拾遗四(集合类型)—包含简单搜索筛选商品设计实例。  。今天关于集合的分享使用做Web的都会的JS来实现。我们先集合类定义如下方法,增加,批量增加,包含?,移除,清空,查询所有,大小,并集,交集,差集。

具体实现如下:

    function Set() {
var items = {}; //对象中键名是唯一的
this.add = function (value) {
if (value != undefined) {
items[value] = value; //新增 键名和值名相同
return true;
} else {
return false;
}
};
this.multiAdd = function (values) {
if (values.constructor == Array) { //是否为数组
values.forEach(function (value) {
if (value != undefined) {
items[value] = value; //新增 键名和值名相同
} else {
return false;
}
});
return true;
}
};
this.has = function (value) {
return items.hasOwnProperty(value); //是否有该属性(对象中属性名和值相同)
};
this.remove = function (value) {
if (this.has[value]) {
delete items[value]; //有则delete 返回true
return true;
}
return false;
};
this.clear = function () {
items = {}; //清空
};
this.values = function () {
return Object.keys(items); //返回所有值
};
this.size = function () {
return Object.keys(items).length; //大小
};
this.union = function (otherSet) { //并集
var unionSet = new Set();
var values = this.values();
values.forEach(function (value) {
unionSet.add(value);
});
var otherValues = otherSet.values();
otherValues.forEach(function (otherValue) { //由于对象属性本身不能重复,所以两个集合值直接合并
unionSet.add(otherValue)
});
return unionSet;
};
this.diff = function (otherSet) { //差集
var diffSet = new Set();
var values = this.values();
var otherValues = otherSet.values();
values.forEach(function (value) {
if (!otherValues.has(values)) { //排除另一个集合的所有值
diffSet.add(value);
}
});
return diffSet;
};
this.interSection = function (onherSet) { //交集
var diffSet = new Set();
var values = this.values();
var otherValues = otherSet.values();
values.forEach(function (value) {
if (otherValues.has(values)) { //取相同值
diffSet.add(value);
}
});
return diffSet;
};
}

详细注释已经在代码中给出。

在ECMA6出现之后,你可以直接使用原生的Set类。

原生类依然提供了如下方法:

了解了基本的实现原理,也就明白了为什么大数据量下,生产环境中Redis要尽量少使用集合来做运算。或者说Redis为什么提供了一种命令,可以直接缓存集合计算结果到新的集合当中。

如果我的点滴分享,对你有点滴帮助,欢迎点击下方红色关注,我将持续输出分享,也欢迎你自己点赞。

                                                                      ——博客园蜗牛

JS实现集合和ECMA6集合的更多相关文章

  1. 学习Redis你必须了解的数据结构——JS实现集合和ECMA6集合

    集合类似于数组,但是集合中的元素是唯一的,没有重复值的.就像你学高中数学的概念一样,集合还可以做很多比如,并集,交集,差集的计算.在ECMA6之前,JavaScript没有提供原生的Set类,所以只能 ...

  2. 【读书笔记】【深入理解ES6】#7-Set集合和Map集合

    ES6新标准中将Set集合和Map集合添加到JS中. ES5中Set集合和Map集合 在ES5中,开发者们用对象属性来模拟这两种集合. var set = Object.create(null); s ...

  3. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  4. Java集合的实现细节—Set集合和Map集合

    Set:代表无序.不可重复的集合 Map:代表key-value对集合,也称为关联数组 从表面上看,Set和Map相似性很少,但实际上可以说Map集合时Set集合的扩展. 1.Set集合和Map集合的 ...

  5. java基础33 Set集合下的HashSet集合和TreeSet集合

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  6. 【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean

    Dao层代码: package com.it.dao; public interface SayHell { public void sayHello(); } Dao的Impl实现层: packag ...

  7. java集合和scala集合互转

    使用 scala.collection.JavaConverters 与Java集合交互.它有一系列的隐式转换,添加了asJava和asScala的转换方法.使用它们这些方法确保转换是显式的,有助于阅 ...

  8. java-Set集合、HashSet集合、LinkedHashSet集合和TreeSet集合

    1.Set集合,无索引,不可以重复,无序(存取不一致) public class Demo { public static void main(String[] args) { //demo1(); ...

  9. List集合和Set集合的遍历方法

    Set集合遍历方法: 对 set 的遍历 1.迭代遍历: Set<String> set = new HashSet<String>(); Iterator<String ...

随机推荐

  1. Codeforces Round #528 Div. 1 自闭记

    整天自闭. A:有各种讨论方式.我按横坐标排了下然后讨论了下纵坐标单调和不单调两种情况.写了15min也就算了,谁能告诉我printf和cout输出不一样是咋回事啊?又调了10min啊?upd:突然想 ...

  2. BZOJ2741 FOTILE模拟赛L(分块+可持久化trie)

    显然做个前缀和之后变成询问区间内两个数异或最大值. 一种暴力做法是建好可持久化trie后直接枚举其中一个数查询,复杂度O(nmlogv). 观察到数据范围很微妙.考虑瞎分块. 设f[i][j]为第i个 ...

  3. BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案

    链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...

  4. suoi22 WRX知识树(dfs序)

    把一条路径拆成到根的四个链(两端点.lca和fa[lca]),然后给dfs序中链的端点做单点修改.区间查询它的子树和再加上它原来的权值就可以了 #include<bits/stdc++.h> ...

  5. 收藏:Win32消息机制

    Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个 ...

  6. Eclipse启动项目正常,放到tomcat下单独启动就报错的 一例

    一个老的ssh的项目,进行二次开发(增加一些新功能)后, 首先用Eclipse中集成的Tomcat启动没有任何问题,但是把启动后的webapps下得目录放到 windows的普通tomcat下单独启动 ...

  7. python 基础数据类型之list

    python 基础数据类型之list: 1.列表的创建 list1 = ['hello', 'world', 1997, 2000] list2 = [1, 2, 3, 4, 5 ] list3 = ...

  8. mongodb 设置用户密码权限

    1 设置管理员账户 use admindb.createUser({ user: "useradmin", pwd: "adminpassword", role ...

  9. Python微信红包算法

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  10. Golang的交互模式进阶-读取用户的输入

    Golang的交互模式进阶-读取用户的输入 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 读写数据除了 fmt 和 os 包,我们还需要用到 bufio 包来处理缓冲的输入和输出. ...