set和map去重调用什么方法_Es6中Map对象和Set对象的介绍及应用
前言
今天说一说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对象的介绍及应用相关推荐
- set和map去重调用什么方法_你真的了解ES6的Set,WeakSet,Map和WeakMap吗?
之前在学习 ES6 的时候,看到 Set 和 Map,不知道其应用场景有哪些,只觉得很多时候会用在数组去重和数据存储,后来慢慢才领悟到 Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结 ...
- set和map去重调用什么方法_【ES6】Set、Map
Set Set 是 ES6 提供给我们的构造函数,能够造出一种新的存储数据的结构 特点:只有属性值没有属性名,成员值唯一 用途:可以转成数组,其本身具备去重(自动去重),交集,并集,差集的作用等 参数 ...
- java未知对象调用其某个方法_引用一个类的属性或调用其方法,必须以这个类的对象为前缀。...
[多选题]根据<建设工程项目管理规范>(GB/T50326-20 17 )施工项目经理应履行的职责有( ) [判断题]数组作参数被使用时,数组名后必须加方括号 [判断题]方法中最多能有一个 ...
- Java遍历Map的五种方法(Java8中新lambda方法)
遍历Map的方法, 我总结了5种, CoreJava中给出的是第一种使用forEach+lambda表达式, 我认为这种方法应该是最好的, 但是只能在Java8之后的版本使用; 建议优先使用第一种和第 ...
- java父类调用子类方法_Java 中父类怎么调用子类的方法?
父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...
- python子类如何调用父类方法_python中子类调用父类函数的方法示例
前言 本文主要给大家介绍了关于python子类调用父类函数的相关内容,Python中子类中的__init__()函数会覆盖父类的函数,一些情况往往需要在子类里调用父类函数.下面话不多说了,来一起看看详 ...
- java中的map是什么_转载java中Map的详解
Map简介 什么是map? map是一个接口 是一个将建key 映射到值的对象. map的主要作用是什么? 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据 将 ...
- python中map函数是什么意思_python中map什么意思
python中map什么意思? python中map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 func ...
- android集合方法,android中intent传递list或者对象的方法
本文实例讲述了android中intent传递list或者对象的方法.分享给大家供大家参考.具体实现方法如下: 方法一: 如果单纯的传递List 或者List的话 就可以直接使用 代码如下: inte ...
最新文章
- 【数论总结】-----励志写好一篇数论总结↖(^ω^)↗//正在施工...未完工
- 指纹锁就安全了?防火防盗还得防AI
- 深入了解MyBatis二级缓存
- masonry的约束应该写在哪里_规划奇思|“中心城区”到底在哪里?和城镇开发边界是什么关系?...
- Git版本管理工具的使用
- linux多台主机对比文件大小,Linux主机df和du出来的文件和磁盘大小不相同
- pip安装指定版本包
- [c#] 服务器提交了协议冲突. Section=ResponseHeader Detail=CR...的解决方案总结
- android md5使用方法,android 使用DigestUtilsmd5加密的方法
- windows抓wifi包 Microsoft Network Monitor
- 使用Amazon SageMaker RL训练离线强化学习策略
- mysql数据库基本操作指令:附图
- 安迪的第一个字典Uva 10815
- NAT类型及工作原理
- 基于浏览器的Linux
- Linkis简单版安装教程
- 6.1. Inserting Data
- AWS S3文件/文件夹删除
- Jenny DAO 运营月报|2021 年 12 月
- Vue - H5 生成带二维码和文案的宣传海报(可自定义二维码扫描后的内容、海报背景图、文案文字、宽高间距等)用 HTML 写可 DIY 的海报,做完后转为图片供用户保存和转发下载