ES6新特性五:Set与Map的数据结构实例分析


Posted in Javascript onApril 21, 2017

本文实例讲述了ES6新特性五之Set与Map的数据结构。分享给大家供大家参考,具体如下:

1. Set

① 定义:类似于数组,但是成员的值都是唯一的,没有重复的值Set本身是一个构造函数,用来生成Set数据结构

var s = new Set();
[2,3,5,4,5,2,2].map(x => s.add(x))
console.log(s); //Set { 2, 3, 5, 4 }

② 属性和方法

Set结构有以下属性

Set.prototype.constructor:构造函数,默认就是Set函数。
Set.prototype.size:返回Set的成员总数。

Set数据结构有以下方法

add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。

var s = new Set();
s.add(1).add(2).add(2);
// 注意2被加入了两次
console.log(s.size) // 2
console.log(s.has(1)) // true
console.log(s.has(2)) // true
console.log(s.has(3)) // false
console.log(s.delete(2));
console.log(s.has(2)) // false

Array.from方法可以将Set结构转为数组

var items = new Set([1, 2, 3, 4, 5]);
var arr = Array.from(items);
//运用: 去除数组中重复元素的方法
var array = [1,2,3,2,3,4];
function fun(array) {
  return Array.from(new Set(array));
}
console.log(fun(array));//[ 1, 2, 3, 4 ]

④ Set结构有一个values方法,返回一个遍历器

var s = new Set([1, 2, 3, 4, 5]);
console.log(s.values());//SetIterator { 1, 2, 3, 4, 5 }
//Set结构的默认遍历器就是它的values方法
console.log(Set.prototype[Symbol.iterator] === Set.prototype.values)//true
//所以遍历可以直接使用 for...of
for (let x of s) {
  console.log(x);
}
//由于扩展运算符(...)内部使用for...of循环,将Set转化为数组。
var arr = [...s];
console.log(arr);//[ 1, 2, 3, 4, 5 ]

⑤ Set结构的foreach方法

var set = new Set([1, 2, 3]);
set.forEach(function(value,key){
  console.log(value);
});

⑥ Set结构也有keys和entries方法,这时每个值的键名就是键值。

let set = new Set(['red', 'green', 'blue']);
for ( let item of set.keys() ){
  console.log(item);
}
// red
// green
// blue
for ( let [key, value] of set.entries() ){
  console.log(key, value);
}
// red, red
// green, green
// blue, blue

⑦ 数组的map和filter方法的运用

map(x){}: 遍历数组,对每一元素进行处理,返回处理后的数组
filter(x){}: 遍历数组,对每一个元素进行校验,返回含有通过校验元素的数组

var set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
console.log(set);//返回Set结构:{2, 4, 6}
var set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));
console.log(set);// 返回Set结构:{2, 4}

2. Map

① 原因:JavaScript的对象,本质上是键值对的集合,但是只能用字符串当作键。

② 定义:它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

③ 属性和方法

size:返回成员总数。
set(key, value):设置key所对应的键值,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。
get(key):读取key对应的键值,如果找不到key,返回undefined。
has(key):返回一个布尔值,表示某个键是否在Map数据结构中。
delete(key):删除某个键,返回true。如果删除失败,返回false。
clear():清除所有成员,没有返回值。

④ 与set 相同 可以接受数组参数创建map,但数组的元素是一个个代表键值对的数组构成

var map = new Map();
var map1 = new Map([["name", "张三"], ["title", "Author"]]);
console.log(map1.size)//2

⑤ 只有对同一个对象的引用,Map结构才将其视为同一个键,只要内存地址不一样,就视为两个键。

var map = new Map();
map.set(['a'], 555);
console.log(map.get(['a'])) // undefined
var k1 = ['a'];
//虽然值相同,但这是一个新的值,内存地址不一样,new 的
var k2 = ['a'];
map.set(k1, 111);
map.set(k2, 222);

⑥ 遍历

Map结构的默认遍历器接口(Symbol.iterator属性),就是entries方法。

keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回所有成员的遍历器。

console.log(Map[Symbol.iterator] === Map.entries)//true
let map = new Map([[1, 'one'], [2, 'two'], [3, 'three']]);
console.log([...map.keys()]);//[ 1, 2, 3 ]
console.log([...map.values()]);//[ 'one', 'two', 'three' ]
console.log([...map.entries()]);//[ [ 1, 'one' ], [ 2, 'two' ], [ 3, 'three' ] ]
console.log([...map]);[ [ 1, 'one' ], [ 2, 'two' ], [ 3, 'three' ] ]

⑦Map还有一个forEach方法,进行遍历。

⑧与set相同,map可以结合数组的map方法、filter方法,可以实现Map的遍历和过滤。

希望本文所述对大家ECMAScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery的DOM操作之删除节点示例
Jan 03 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
Jan 10 Javascript
jQuery学习笔记之toArray()
Jun 09 Javascript
jQuery实现文本展开收缩特效
Jun 03 Javascript
详解JS中Array对象扩展与String对象扩展
Jan 07 Javascript
JavaScript中split与join函数的进阶使用技巧
May 03 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
Jun 20 Javascript
jQuery中的100个技巧汇总
Dec 15 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
Feb 21 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
Sep 15 Javascript
webpack配置的最佳实践分享
Apr 21 #Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 #Javascript
ES6新特性四:变量的解构赋值实例
Apr 21 #Javascript
jQuery+pjax简单示例汇总
Apr 21 #jQuery
利用n工具轻松管理Node.js的版本
Apr 21 #Javascript
基于jQuery实现文字打印动态效果
Apr 21 #jQuery
ES6新特性三: Generator(生成器)函数详解
Apr 21 #Javascript
You might like
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
PHP微信API接口类
2016/08/22 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
python set内置函数的具体使用
2019/07/02 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
物控部经理职务说明书
2014/02/25 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
请假条格式范文
2014/04/10 职场文书
优秀教师申报材料
2014/12/16 职场文书
检讨书模板
2015/01/29 职场文书
教师党员自我评价2015
2015/03/04 职场文书
少年雷锋观后感
2015/06/10 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js
Nginx跨域问题解析与解决
2022/08/05 Servers