前言

今天说一说ES6的Set对象和Map对象。以及这两个对象的应用。目前主流浏览器(chrome32、IE11、Safari7.1以及 Firefox 13以上)都对这2个对象做了基本的支持。因此,和css3一样,es6慢慢走进了前端开发的舞台,未来,我们可以不用再利用Babel对ES6语法进行编译就可以直接支持es6语法了。

Map 对象

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

Map方法

var myMap = new Map();

myMap.set("bar", "baz");

myMap.set(1, "foo");

myMap.size; // 2

myMap.has("bar"); // true

myMap.clear();

myMap.size; // 0

myMap.has("bar") // false

使用for..of方法迭代映射

var myMap = new Map();

myMap.set(0, "zero");

myMap.set(1, "one");

for (var [key, value] of myMap) {

console.log(key + " = " + value);

}

// 将会显示两个log。一个是"0 = zero"另一个是"1 = one"

for (var key of myMap.keys()) {

console.log(key);

}

// 将会显示两个log。 一个是 "0" 另一个是 "1"

for (var value of myMap.values()) {

console.log(value);

}

// 将会显示两个log。 一个是 "zero" 另一个是 "one"

for (var [key, value] of myMap.entries()) {

console.log(key + " = " + value);

}

// 将会显示两个log。 一个是 "0 = zero" 另一个是 "1 = one"

使用forEach()方法迭代映射

myMap.forEach(function(value, key) {

console.log(key + " = " + value);

}, myMap)

// 将会显示两个logs。 一个是 "0 = zero" 另一个是 "1 = one"

Set 对象

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set 对象方法

var mySet = new Set();

mySet.add(1);

mySet.add("foo");

mySet.size; // 2

mySet.has("foo"); // true

mySet.clear();

mySet.size; // 0

mySet.has("bar") // false

迭代Set对象

// 迭代整个set

// 按顺序输出:1, "some text"

for (let item of mySet) console.log(item);

// 按顺序输出:1, "some text"

for (let item of mySet.keys()) console.log(item);

// 按顺序输出:1, "some text"

for (let item of mySet.values()) console.log(item);

// 按顺序输出:1, "some text"

//(键与值相等)

for (let [key, value] of mySet.entries()) console.log(key);

// 转换Set为Array (with Array comprehensions)

var myArr = [v for (v of mySet)]; // [1, "some text"]

// 替代方案(with Array.from)

var myArr = Array.from(mySet); // [1, "some text"]

// 如果在HTML文档中工作,也可以:

mySet.add(document.body);

mySet.has(document.querySelector("body")); // true

// Set和Array互换

mySet2 = new Set([1,2,3,4]);

mySet2.size; // 4

[...mySet2]; // [1,2,3,4]

// 用forEach迭代

mySet.forEach(function(value) {

console.log(value);

});

Set 与 Array 的联系

var myArray = ["value1", "value2", "value3"];

// 用Set构造器将Array转换为Set

var mySet = new Set(myArray);

mySet.has("value1"); // returns true

// 用...(展开操作符)操作符将Set转换为Array

console.log([...mySet]); // 与myArray完全一致

...扩展语句

扩展语法允许一个表达式在期望多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置扩展。

let arr1 = [0, 1, 2];

let arr2 = [3, 4, 5];

arr1 = [...arr2, ...arr1];

console.log(arr1) // [3, 4, 5, 0, 1, 2]

应用一:Set对象数组去重

var arr=[3, 62, 3, 38, 20, 42, 14, 5, 38, 29, 42];

console.log(new Set(arr))

可以封装一个函数

function uniqueArray(arr){

return Array.from(new Set(arr));

}

用这个函数可以数组去重。

或者如下写也可以,比较简单的数组去重

[...new Set([1,3,4,5,1,2,3,3,4,8,90,3,0,5,4,0])]

重复值处理

场景:

当地图往下拖的时候要更新地图上的房源标签数据,上图绿框表示不变的标签,而黄框表示新加的房源。

后端每次都会把当前地图可见区域的房源返回给我,当用户拖动的时候需要知道哪些是原先已经有的房源,哪些是新加的。把新加的房源画上,而把超出区域的房源删掉,已有的房源保持不动。因此需要对比当前房源和新的结果哪些是重复的。因为如果不这样做的话,改成每次都是全部删掉再重新画,已有的房源标签就会闪一下。因此为了避免闪动做一个增量更新。

把这个问题抽象一下就变成:给两个数组,需要找出第一个数组里面的重复值和非重复值。即有一个数组保存上一次状态的房源,而另一个数组是当前状态的新房源数据。找到的重复值是需要保留,找到非重复值是要删掉的。

用es6 Set对象实现如下:

var lastHouses = new Set();

function filterHouse(houses){

var remainsHouses = [],

newHouses = [];

houses.map(house => lastHouses.has(house.id) ? remainsHouses.push(house)

: newHouses.push(house));

newHouses.map(house => lastHouses.add(house.id));

return {remainsHouses, newHouses};

}

用es6 Map对象实现如下:

var lastHouses = new Map();

function filterHouse(houses){

var remainsHouses = [],

newHouses = [];

houses.map(house => lastHouses.has(house.id) ? remainsHouses.push(house)

: newHouses.push(house));

newHouses.map(house => lastHouses.set(house.id, house));

return {remainsHouses, newHouses};

}

set和map去重调用什么方法_Es6中Map对象和Set对象的介绍及应用相关推荐

  1. set和map去重调用什么方法_你真的了解ES6的Set,WeakSet,Map和WeakMap吗?

    之前在学习 ES6 的时候,看到 Set 和 Map,不知道其应用场景有哪些,只觉得很多时候会用在数组去重和数据存储,后来慢慢才领悟到 Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结 ...

  2. set和map去重调用什么方法_【ES6】Set、Map

    Set Set 是 ES6 提供给我们的构造函数,能够造出一种新的存储数据的结构 特点:只有属性值没有属性名,成员值唯一 用途:可以转成数组,其本身具备去重(自动去重),交集,并集,差集的作用等 参数 ...

  3. java未知对象调用其某个方法_引用一个类的属性或调用其方法,必须以这个类的对象为前缀。...

    [多选题]根据<建设工程项目管理规范>(GB/T50326-20 17 )施工项目经理应履行的职责有( ) [判断题]数组作参数被使用时,数组名后必须加方括号 [判断题]方法中最多能有一个 ...

  4. Java遍历Map的五种方法(Java8中新lambda方法)

    遍历Map的方法, 我总结了5种, CoreJava中给出的是第一种使用forEach+lambda表达式, 我认为这种方法应该是最好的, 但是只能在Java8之后的版本使用; 建议优先使用第一种和第 ...

  5. java父类调用子类方法_Java 中父类怎么调用子类的方法?

    父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...

  6. python子类如何调用父类方法_python中子类调用父类函数的方法示例

    前言 本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数.下面话不多说了,来一起看看详 ...

  7. java中的map是什么_转载java中Map的详解

    Map简介 什么是map? map是一个接口  是一个将建key 映射到值的对象. map的主要作用是什么? 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据 将 ...

  8. python中map函数是什么意思_python中map什么意思

    python中map什么意思? python中map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 func ...

  9. android集合方法,android中intent传递list或者对象的方法

    本文实例讲述了android中intent传递list或者对象的方法.分享给大家供大家参考.具体实现方法如下: 方法一: 如果单纯的传递List 或者List的话 就可以直接使用 代码如下: inte ...

最新文章

  1. 【数论总结】-----励志写好一篇数论总结↖(^ω^)↗//正在施工...未完工
  2. 指纹锁就安全了?防火防盗还得防AI
  3. 深入了解MyBatis二级缓存
  4. masonry的约束应该写在哪里_规划奇思|“中心城区”到底在哪里?和城镇开发边界是什么关系?...
  5. Git版本管理工具的使用
  6. linux多台主机对比文件大小,Linux主机df和du出来的文件和磁盘大小不相同
  7. pip安装指定版本包
  8. [c#] 服务器提交了协议冲突. Section=ResponseHeader Detail=CR...的解决方案总结
  9. android md5使用方法,android 使用DigestUtilsmd5加密的方法
  10. windows抓wifi包 Microsoft Network Monitor
  11. 使用Amazon SageMaker RL训练离线强化学习策略
  12. mysql数据库基本操作指令:附图
  13. 安迪的第一个字典Uva 10815
  14. NAT类型及工作原理
  15. 基于浏览器的Linux
  16. Linkis简单版安装教程
  17. 6.1. Inserting Data
  18. AWS S3文件/文件夹删除
  19. Jenny DAO 运营月报|2021 年 12 月
  20. Vue - H5 生成带二维码和文案的宣传海报(可自定义二维码扫描后的内容、海报背景图、文案文字、宽高间距等)用 HTML 写可 DIY 的海报,做完后转为图片供用户保存和转发下载

热门文章

  1. 值传递和引用传递传的到底是啥?
  2. 满满的一整篇,全是 JVM 核心知识点!
  3. Java 拷贝,你能说出个 123 么?
  4. 那些在一家公司呆了 10 年的程序员,最后都怎么了?
  5. 从芯片到 AI 生态,52 岁英特尔的蜕变!
  6. 现在是 RSS 复兴的时候了!
  7. 又一 5G+AIoT 的强强联手!
  8. ofo 悄然搬离中关村;董明珠称向雷军学互联网营销;Chrome 77 发布 | 极客头条...
  9. 零基础如何快速入门深度学习?
  10. 京东回应淘汰员工;阿里巴巴建江苏总部;5G 移动网被吐槽 | 极客头条