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 相关文章推荐
Javascript 面向对象之重载
May 04 Javascript
js+xml生成级联下拉框代码
Jul 24 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
Aug 05 Javascript
JS如何判断移动端访问设备并解析对应CSS
Nov 27 Javascript
JS阻止用户多次提交示例代码
Mar 26 Javascript
chrome下jq width()方法取值为0的解决方法
May 26 Javascript
JS长整型精度问题实例分析
Jan 13 Javascript
jQuery插件datalist实现很好看的input下拉列表
Jul 14 Javascript
jQuery使用正则表达式限制文本框只能输入数字
Jun 18 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 Javascript
vue interceptor 使用教程实例详解
Sep 13 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 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简单实现冒泡排序的方法
2016/12/26 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
Python正则表达式匹配中文用法示例
2017/01/17 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Python 私有化操作实例分析
2019/11/21 Python
python使用Geany编辑器配置方法
2020/02/21 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
入党申请自荐书范文
2014/02/11 职场文书
党员入党表决心的话
2014/03/11 职场文书
交通安全寄语大全
2014/04/08 职场文书
三年级学生期末评语
2014/12/26 职场文书
士兵突击观后感
2015/06/16 职场文书