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 相关文章推荐
在html页面中包含共享页面的方法
Oct 24 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
Dec 17 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
JavaScript获取并更改input标签name属性的方法
Jul 02 Javascript
jQuery表格插件datatables用法汇总
Mar 29 Javascript
jQuery组件easyui对话框实现代码
Aug 25 Javascript
JS正则子匹配实例分析
Dec 22 Javascript
Vuex之理解Mutations的用法实例
Apr 19 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
Jul 08 jQuery
微信小程序使用navigateTo数据传递的实例
Sep 26 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 Javascript
vue-openlayers实现地图坐标弹框效果
Sep 24 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
多文件上传的例子
2006/10/09 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
php字符串分割函数用法实例
2015/03/17 PHP
PHP实现CSV文件的导入和导出类
2015/03/24 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
JavaScript网页定位详解
2014/01/13 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
Python常用小技巧总结
2015/06/01 Python
Python制作简单的网页爬虫
2015/11/22 Python
win7+Python3.5下scrapy的安装方法
2018/07/31 Python
python3 flask实现文件上传功能
2020/03/20 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Python新手学习装饰器
2020/06/04 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
校园十佳歌手策划书
2014/01/22 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
模范家庭事迹材料
2014/02/10 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书