ES6中的Set/Map集合和数组的扩展

ES6 Promise的then方法,Set集合实例,class类各个实现和继承(1) 开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】就答题情况而言,第一问100%都可以回答正确,第二问大概只有50%正确率,第三问能回答正确的就不多了,第四问再正确就非常非常少了。其实此题并没有太多刁钻匪夷所思的用法,都是一些可能会遇到的场景,而大多数人但凡有1年到2年的工作经验都应该完全正确才对。只能说有一些人太急躁太轻视了,希望大家通过此文了解js一些特性。小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 阅读详情

一、set 集合

Set:它类似于数组,但是成员的值都是唯一的,没有重复的值。set用于存放不重复的数据

1、创建Set 集合
new Set(); //创建一个没有任何内容的set集合

new Set(iterable); //创建一个具有初始内容的set集合,内容来自于可迭代对象每一次迭代的结果
const arr = [1,2,3,4,5,1,2]
const sets = new Set(arr)
console.log(sets)
2、Set 集合的增删改查

(1)add(data):添加一个数据到set集合末尾,如果数据已存在,则不进行任何操作

(2)has(data): 判断set中是否存在对应的数据

(3)delete(data):删除匹配的数据,返回是否删除成功

(4)clear():清空整个set集合

(4)size:获取set集合中的元素数量,只读属性,无法重新赋值

const arr = [1,2,3,4,5,2]
//const sets = new Set([1,2,3,4,5,2])
const sets = new Set(arr)
sets.add(7) //Set(6) {1, 2, 3, 4, 5, 7}
sets.delete(2) //Set(5) {1, 3, 4, 5, 7}
const res = sets.has(2)//false
sets.size  //5
sets.clear() //Set(0){}

注意:Set 使用Object.is()的方式判断两个数据是否相同,但是,针对+0和-0,set认为是相等

3、与数组字符串进行相互转换
const s = new Set([x,x,x,x,x]);
// set本身也是一个可迭代对象,每次迭代的结果就是每一项的值
const arr = [...s];

数组去重:

let arr = [1,2,3,4,5,1,2]
arr = [...new Set(arr)]
console.log(arr)

字符串去重:

let str = "aslfhjiowvmlkpwifgefjmsa"
str = [...new Set(str)].join("")
console.log(str)
4、Set 遍历

(1)使用for-of循环

const sets = new Set([1,5,2,4,3,2])
for (const item of sets) {
    console.log(item) //1
}

(2)使用set中的实例方法forEach

const sets = new Set([1,5,2,4,3,2])
sets.forEach((ele,index,s) => {
    //set集合中没有下标,因此ele和index是一样的
    console.log(ele,index,s) //1 1 Set(5) {1, 5, 2, 4, 3}
});

注意:set集合中不存在下标,因此forEach中的回调的第二个参数和第一个参数是一致的,均表示set中的每一项

求两个数组的并集,交集,差集

const arr1 = [1,4,7,9,6,0]
const arr2 = [4,5,6,1,3,2]
//并集
const result1 = [...new Set(arr1.concat(arr2))]
const result2 = [...new Set([...arr1,...arr2])]
console.log("并集",result1,result2)
//交集
let s1 = new Set(arr1)
let s2 = new Set(arr2)

const result3 = [...s1].filter(item=>{
    return s2.has(item)
})
console.log("交集",result3)
//差集
const result4 = [...new Set([...arr1,...arr2])].filter(item=>result3.indexOf(item)<0)
console.log("差集",result4)
5、手写Set (仿照,并非真实底层实现)
//手写set
class MySet{
    constructor(iterator = []){
        //验证是否可迭代对象 Symbol.iterator知名符号
        if(typeof iterator[Symbol.iterator] !== "function"){
            throw new TypeError("你提供的不是可迭代的对象")
        }
        this._datas = []; //存放set数据
        for (const item of iterator) {
            this.add(item)
        }
    }
    //set的添加方法
    add(data){
        if(!this.has(data))
        this._datas.push(data)
    }
    //判断是否含有一个元素。
    has(data){
        for (const item of this._datas) {
            if(this.isEqual(item,data)){
                return true
            }
        }
        return false
    }
    //判断两个元素是否相等,用Object.is()方法判断。特殊判断,+0和-0的情况
    isEqual(data1,data2){
        if(data1 === 0 && data2 === 0){
            return true
        }
        return Object.is(data1,data2)
    }
    //删除元素
    delete(data){
        for(let i=0;i<this._datas.length;i++){
            const ele = this._datas[i]
            if(this.isEqual(ele,data)){ //找到元素
                this._datas.splice(i,1) //删除元素
                return true
            }
        }
        return false
    }
	//清除元素的方法
    clear(){
        this._datas = []
    }
    *[Symbol.iterator](){
        for(const item of this._datas){
            yield item //迭代器中的关键字
        }
    }
    //提供forEach方法迭代遍历
    forEach(callback){
        for (const item of this._datas) {
            callback(item,item,this)
        }
    }
}
let s = new MySet([1,2,2,3,4,5])
console.log(s)
s.forEach((item,index,data)=>{
    console.log(item,index,data)
})

二、WeakSet

WeakSet 集合与 Set 类似,也是不重复的值的集合

1、WeakSet 的成员只能是对象,而不能是其他类型的值。
const ws = new WeakSet();
ws.add(1)
// TypeError: Invalid value used in weak set
2、WeakSet 中的对象都是弱引用

垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

3、不能遍历(不是可迭代的对象)、没有size属性、没有forEach方法

三、Map集合

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

键值对(key value pair)数据集合的特点:键不可重复.也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

map集合专门用于存储多个键值对数据。

1、创建Map
new Map(); //创建一个空的map
new Map(iterable); //创建一个具有初始内容的map,初始内容来自于可迭代对象每一次迭代的结果,但是,它要求每一次迭代的结果必须是一个长度为2的数组,数组第一项表示键,数组的第二项表示值
2、Map的增删改查

(1)size:只读属性,获取当前map中键的数量

(2)set(键, 值):设置一个键值对,键和值可以是任何类型

- 如果键不存在,则添加一项
- 如果键已存在,则修改它的值
- 比较键的方式和set相同

(3)get(键): 根据一个键得到对应的值

(4)has(键):判断某个键是否存在

(5)delete(键):删除指定的键

(6)clear():清空map

const map1 = new Map([["a",1],["b",2]])
map1.set({a:1},1) //0: {"a" => 1}
                  //1: {"b" => 2}
                  //2: {Object => 1}
                  //>key: {a: 1}
                  //>value: 1
console.log(map1.get("a")) //1
map1.delete("a")
console.log(map1.has("a")) //false
console.log(map1.size) //2
3、与数组互相转换
let arr = [[1,2],[3,4],[5,1]]
arr = [...new Map(arr)]
console.log(arr)
4、遍历

(1)for-of,每次迭代得到的是一个长度为2的数组

const map1 = new Map([["a",1],["b",2]])
for (const [key,value] of map1) {
   console.log(key,value)
}

(2)forEach,通过回调函数遍历

const map1 = new Map([["a",1],["b",2]])
/*
参数1:每一项的值
参数2:每一项的键
参数3:map本身
*/
map1.forEach((key,value,m) => {
   console.log(key,value,m)
});
5、手写Map
class MyMap{
   constructor(iterator = []){
        if(typeof iterator[Symbol.iterator] !== "function"){
            throw new TypeError("Uncaught TypeError")
        }
        this._datas = []
        for (const item of iterator) {
            if(typeof item[Symbol.iterator] !== "function"){
                throw new TypeError("Uncaught TypeErro")
            }
            const it = item[Symbol.iterator]()
            const key = it.next().value
            const value = it.next().value
            this.set(key,value)
        }
   }
   //设置key-value
   set(key,value){
       const obj = this._getObj(key)
       if(obj){
          obj.value = value
       }else{
          this._datas.push({key,value})
       }

   }
   //获取value值
   get(key){
       const item = this._getObj(key)
       if(item){
           return item.key
       }
       return undefined
   }
   _getObj(key){
       //根据key值,找到对想
       for (const item of this._datas) {
           if(this.isEqual(key,item.key)){
               return item
           }
       }
       return undefined
   }
   delete(key){
       for(let i=0;i<this._datas.length;i++){
           if(this.isEqual(key,this._datas[i].key)){
               this._datas.splice(i,1)
               return true
           }
       }
   }
   has(key){
       return _getObj(key) !== undefined
   }
   isEqual(data1,data2){
        if(data1 === 0 && data2 === 0){
            return true
        }
        return Object.is(data1,data2)
   }
}

const mymap = new MyMap([["a",1],["b",2]]);
mymap.set(1,2)
mymap.delete("a")
console.log(mymap)

四、WeakMap

1、WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
const map = new WeakMap();
map.set(1, 2)// TypeError: 1 is not an object!
2、WeakMap的键名所指向的对象,不计入垃圾回收机制。
3、WeakMapsize、forEach、clear 方法都不存在
const wm = new WeakMap();
wm.size // undefined
wm.forEach // undefined
wm.clear // undefined
  1. 它的键存储的地址不会影响垃圾回收
  2. 它的键只能是对象
  3. 不能遍历(不是可迭代的对象)、没有size属性、没有forEach方法

五、数组的扩展

1、静态方法

(1)Array.of(…args):使用指定的数组项创建一个新数组

const arr = Aarray.of(1,2,3,4,5)
//解决
const arr1 = new Array(1)//表示的是数组长度

(2)Array.from(arg):通过给定的类数组 或 可迭代对象 将它转为真正的数组。

const divs = document.querySelectorAll("div")
//Array.prototype.slice.call(divs,0)
const divArr = Array.from(divs)

2、实例方法

(1)find(callback):用于查找满足条件的第一个元素

const arr = [
    {id:1,name:"llx"},
    {id:2,name:"lkh"},
    {id:3,name:"qqw"}
]
const result = arr.find(item=>item.id === 2)
console.log(result) //{id: 2, name: "lkh"}

(2)findIndex(callback):用于查找满足条件的第一个元素的下标

const arr = [1, 5, 10, 15]
const result = arr.findIndex((value, index, arr) => {
  return value > 9;
}) 
console.log(result)// 2

(3)fill(data):用指定的数据填充满数组所有的内容

const arr = new Array(10)//表示的是数组长度
arr.fill(0)
console.log(arr) //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

(4)copyWithin(target, start, end):在数组内部完成复制

const arr = [1,2,3,4,5,6]
arr.copyWithin(2) //[1, 2, 1, 2, 3, 4]

const arr = [1,2,3,4,5,6]
arr.copyWithin(2,1)// [1, 2, 2, 3, 4, 5]

const arr = [1,2,3,4,5,6]
arr.copyWithin(2,1,3) //[1, 2, 2, 3, 5, 6]

(5)includes(data):判断数组中是否包含某个值,使用Object.is匹配

const arr = [1,2,3,4]
arr.includes(2) //true
基于FPGA的DDS信号发生器 之前的博客讲到了DDS的基本原理,现在用Verilog代码实现DDS,能够产生四种波形,方波,三角波,正弦波,锯齿波,用按键来控制频率和选择波形。其中按键消抖模块来自小梅哥的FPGA自学笔记设计与验证这本书。 module DDS_Module( Clk, Rst_n, EN, Fword, Key1, Pword, DA_Clk, DA_Data ); input Clk... 阅读详情

相关推荐

3D坐标系转换实战:如何用Python快速实现旋转矩阵与平移向量的组合变换

本文详细介绍了如何使用Python和NumPy实现3D坐标系转换中的旋转矩阵与平移向量的组合变换。通过齐次坐标和变换矩阵的数学原理,结合代码示例,帮助开发者高效处理机器人路径规划和计算机视觉中的空间变换问题,并解决实际应用中的常见错误。

pluto的博客 959

JavaScript把集合转换成数组(ES6语法)

数组可以使用众多的操作方法,如push()、pop()、等,但是对于一个集合来说是无法直接使用数组的方法的,那么ES6就给我们提供了一个把集合转变成数组的方法 Array.from() 第一个案例 let arr = Array.of(3,4,7,9,11); console.log('arr=',arr) //arr=[3,4,7,9,11] 第二个案例 <html> ...

奔跑的面条博客 5781

从零开始:用Python实现AlphaZero五子棋AI(附完整代码)

本文详细介绍了如何从零开始使用Python实现AlphaZero五子棋AI。通过工程化实践,逐步构建蒙特卡洛树搜索(MCTS)、轻量化残差网络(ResNet)以及自博弈训练循环,并提供完整可运行的代码。文章旨在帮助开发者绕过复杂理论,聚焦实战,最终打造一个能够自我学习与对弈的智能体,是深度强化学习在游戏AI领域的一次完整项目实战。

weixin_29081703的博客 416

ES6 数组方法归纳整理

ES6 操作数组方法 1.判断是否为数组 let arr = [1,2,3] console.log( Array.isArray(arr) )// true console.log( Array.isArray([]) ) //true 2.创建数组 new Array() 创建数组 如果使用Array构造函数传入一个数值型的值,那么数组的长度length属性会被设置为该值; let items = new Array(2); console.log(items.length); // 2

weixin_41801013的博客 1822

等保: Postgresql配置ssl链接

等保: postgresql配置ssl链接完整方案和避坑指南

weixin_43557605的博客 4383

手机热点+Advanced IP Scanner:5分钟搞定树莓派无屏SSH连接(附详细配置截图)

本文详细介绍如何利用手机热点和Advanced IP Scanner工具快速实现树莓派的无屏SSH连接。通过简单的WiFi配置和IP扫描,5分钟内即可完成连接,特别适合外出调试或空间有限的工作环境。文章包含详细步骤、配置截图和常见问题解决方案,帮助开发者高效管理树莓派设备。

ik678901234的博客 954

es6 语法 (map、set和array 的对比)

//数据结构对比 增查改删 { //map和array对比 let map = new Map(); let array = []; //增 map.set('t',1); array.push({t:1}); console.info('map-array',map,array) //{"t"=&g...

adai19850204的博客 409

从药企研发视角:如何用GNN提升分子水溶性预测准确率?PyTorch+ESOL全案例

本文从药企研发的实际需求出发,详细介绍了如何利用图神经网络(GNN)技术,结合PyTorch框架和ESOL数据集,构建并优化分子水溶性预测模型。通过完整的代码案例,深入探讨了分子图数据处理、GNN架构设计、超参数调优以及模型评估与解释等关键环节,旨在帮助研发团队提升预测准确率,从而更高效地筛选和优化候选药物分子。

weixin_29054399的博客 292

es6 Set和Array

转换 Array 转换成 Set let arr = [1, 2, 3] let set = new Set(arr) // Set(3) {1, 2, 3} Set 转换成 Array let set = new Set([1, 2, 3]) let arr = [...set] // [1, 2, 3] 区别 唯一性 Array 是可以包含重复值的, let arr = [1, 1, 2, 2] 而 Set 中的值则总是唯一的,不会有重复值存在,这也是 Set 跟数组之间最直观的区别。 n

KLmxwx569的博客 485

当几何失效时:3D激光SLAM退化场景的本质与应对策略

本文探讨了3D激光SLAM在退化场景(如长廊、隧道等)中的挑战与解决方案。文章从数学角度分析了退化原因,指出信息矩阵秩亏导致某些方向约束缺失。主流算法采用不同策略应对:LeGO-LOAM利用地面约束与解耦优化;LIO-SAM/LVI-SAM通过多传感器融合补偿;FAST-LIO系列依赖IMU短期积分。新兴的RID-LIO方案创新性地利用激光强度信息增强约束,实验显示精度提升63.59%。研究表明,针对不同退化方向需要采用特异性补偿策略,而挖掘现有传感器的潜在信息维度是提升鲁棒性的有效途径。

Studying…… 619

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2448

es6获取数组中,键值对的下标和对应内容

const fruits = [ {name: 'apples', quantity: 2},    {name: 'bananas', quantity: 0},    {name: 'cherries', quantity: 5}];const index = fruits.findIndex(fruit =&gt; fruit.name === 'cherries');console.lo...

github_38696818的博客 2万+

华为OD机试真题 新系统 - 计算数列位置N的值 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2010

【ES6】新语法入门篇

【ES6】新语法 let关键字 新加入了块级作用域(即在大括号中的就是块级作用域,例如if中) 没有变量提升了 不能从新定义了 就算在全局中生成let变量,他也不会存在在window对象中 在es6中函数的形参就是相当于用let定义的变量,不能重复声明 function fun(a) { console.log(a) let a = 1//报错 } fun(12) 如果在一个作用域中定义了一个变量,这个作用域内的这个变量就被封闭了,就不能再访问到外界的这个

优快云zhaojiale的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JavaScript的Set和Map:ES6集合类型的高效使用

Set提供了`add`、`delete`和`has`等方法,操作时间复杂度接近O(1),远优于数组的`includes`或`indexOf`。Map还保留了插入顺序,并提供了`set`、`get`和`forEach`等直观的API。但需注意,频繁迭代时,转换为数组可能更合适,因为Set和Map的迭代器性能略低于原生数组。例如,通过`Array.from`将Set转为数组,或使用扩展运算符`...`快速合并Map的键值。通过合理使用Set和Map,开发者可以写出更简洁、高效的JavaScript代码。

sxjzqo_698的博客 223

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

浅学 ES6

ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准.使得JavaScript语言可以用来编写复杂。

weixin_39891473的博客 280

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

前端 - js - - es6新特性(高频面试题)

tab键上面的那个键 和普通字符串使用方式没区别 但多了一项功能 ${ } 可以在${ }中引用变量 代替传统字符串写法:"我是字符串 我有一个变量" + value + "这个就是我的变量" 使用模板字符串:`我是模板字符串 我有一个变量${value}这个就是我的变量`1.let定义变量 const定义常量 即let定义的属性可以修改 const定义的属性不可修改 引用数据类型可修改值 不可修改内存地址。2.let定义的属性可不赋值 const定义的属性必须赋值。可在直接定义返回对象中的某个属性。

yky1071442177的博客 519

ES6学习笔记——B站小马哥

es6

m0_52041525的博客 589

笔记-ES6

ES6新特性学习

m0_53759248的博客 248

vue-chartjs 入门指南:在 Vue 3 中集成 Chart.js 4 并构建可复用图表组件

**vue-chartjs** 是面向 Vue 的 Chart.js 官方生态封装库,它把 Chart.js 的底层初始化、销毁与响应式更新逻辑抽象成标准 Vue 组件,同时完整暴露 Chart.js 实例以便做任意深度定制。本文基于 `vue-chartjs` v5(配套 Chart.js v4)官方 Getting Started 文档展开,结合本仓库源码、单元测试与 sandbox 示例,带

gitblog_00218的博客 928

ES6新特性(中)——ES6的集合(set集合、map集合等)

ES6的集合 1、Set集合 2、WeakSet集合 3、Map集合

m0_46420078的博客 2597

ES6(三):Set和Map数据结构,数组的扩展,Iterator迭代器,Generator函数

ES6中的Set和Map数据类型,数组的扩展,Iterator迭代器的基本用法,Generator函数的基本用法和应用场景

weixin_53453884的博客 1224

不仅是数组:彻底搞懂 Map、Set 与 ES6+ 集合新特性

本文介绍了ES6新增的Set和Map数据结构及其应用场景。Set主要用于数组去重和集合运算,相比传统方法更简洁高效。Map解决了Object键只能是字符串的限制,支持任意类型键值,且保持插入顺序。文章还讲解了WeakMap/WeakSet的弱引用特性如何避免内存泄漏,并列举了数组的新增方法如Array.from、includes等。最后给出了开发建议:数组去重优先用Set,复杂键值场景用Map,同时强调WeakMap在底层开发中的重要性。这些新特性显著提升了JavaScript处理数据的能力。

技术分享 850

ES6的Set和Map你都知道吗?一文了解集合和字典在前端中的应用

一文了解集合和字典在前端中的应用一、集合1、集合是什么?2、前端与集合:使用ES6中的Set3、用Set模拟并集、交集和差集(1)模拟并集运算(2)模拟交集运算(3)模拟差集运算4、使用扩展运算符来模拟并集、交集和差集(1)用扩展运算符实现并集(2)用扩展运算符实现交集(3)用扩展运算符实现差集5、leetcode案例题分析(1)leetcode349两个数组的交集二、字典1、字典是什么?2、前端与集合:使用ES6中的Map3、使用Map类的API4、leetcode案例题分析(1)leet

moandaylab 555

ES6--》JS中Set 和 Map数据结构

它类似于数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用 [扩展运算符] 和 [for...of] 进行遍历。由于 Set 结构键名和键值是同一个值,所以 keys 方法和 values 方法的行为完全一致,都是返回键名/值。forEach()方法用于对每个成员执行某种操作,该方法参数就是一个处理函数,该函数的参数与数组的forEach一致。entries方法返回的结果包括键名和键值,所以输出的数组,其键名和键值完全相等。Map的遍历操作和上文的Set方法一致,这里不再讲解。

ztK63LrD的博客 727

js中的map和set

map和set是 es6新增的数据类型: 网上有很多set和map分别对比数组的区别: https://www.cnblogs.com/7qin/p/9630964.html 主要看增删查改 js中的map和set https://es6.ruanyifeng.com/#docs/set-map https://blog.youkuaiyun.com/qq_38880700/article/details/84822932 set的作用: 可以用于数组去重,因为里面的值都是唯一的。...

南北极之间 4239
上一篇: ES6基础:初始ES6新语法
下一篇: ES6中的类和符号
七钥
博客等级 码龄9年 744粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值