热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前端面试系列JavaScript数据结构map和set

文章目录一、map1.特性1.1键值对,键可以是对象。1.2.Map可以接受数组作为参数(批量插入)2.属性和方法3.遍历4.和其它结构的互转二、set1.特性2.属

文章目录

  • 一、map
    • 1.特性
      • 1.1键值对,键可以是对象。
      • 1.2.Map可以接受数组作为参数(批量插入)
    • 2.属性和方法
    • 3.遍历
    • 4. 和其它结构的互转
  • 二、set
    • 1.特性
    • 2.属性和方法
    • 3.遍历
    • 4.和其他结构互转
    • 5.应用


一、map

Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成”[object Object]“。

ES6提供了”值-值“对的数据结构,键名不仅可以是字符串,也可以是对象。它是一个更完善的Hash结构。

1.特性


1.1键值对,键可以是对象。

const map1 = new Map()
const objkey = {p1: 'v1'}map1.set(objkey, 'hello')
console.log(map1.get(objkey))
//hello

1.2.Map可以接受数组作为参数(批量插入)

数组成员还是一个数组,其中有两个元素,一个表示键一个表示值。
[key, value]

const map2 = new Map([['name', 'Aissen'],['age', 12]
])
console.log(map2.get('name'))
console.log(map2.get('age'))
//Aissen
// 12

2.属性和方法


  • size: 属性返回 Map 结构的成员总数

实例方法(基本上同Set):

  • set(key, value): 返回的是当前的Map对象,因此可以采用链式写法。
  • get(key):读取key对应的键值,如果找不到key,返回undefined。
  • has(key)
  • delete(key)
  • clear()

遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历 Map 的所有成员。

设置键值对,键可以是各种类型,包括undefined,function

const map4 = new Map();
map4.set('k1', 6) // 键是字符串
map4.set(222, '哈哈哈') // 键是数值
map4.set(undefined, 'gagaga') // 键是 undefinedconst fun = function() {console.log('hello');}
map4.set(fun, 'fun') // 键是 functionconsole.log('map4 size: %s', map4.size)
//map4 size: 4
console.log('undefined value: %s', map4.get(undefined))
//undefined value: gagaga
console.log('fun value: %s', map4.get(fun))
//fun value: fun

链式调用

map4.set('k2', 2).set('k3', 4).set('k4', 5)
console.log('map4 size: %s', map4.size)//7

3.遍历


  • map.keys() 遍历所有key

const map9 = new Map();map9.set('k1', 1);map9.set('k2', 2);map9.set('k3', 3);for (let key of map9.keys()) {console.log(key);}//k1 //k2 //k3

  • map.values() 遍历所有值

  • map.entries() 遍历所有键值对

for (let item of map9.entries()) {console.log(item[0], item[1]);}或者for (let [key, value] of map9.entries()) {console.log(key, value);}

  • map.forEach() 遍历所有键值对

map9.forEach(function(value, key, map) {console.log("Key: %s, Value: %s", key, value);});

forEach有第二个参数,可以用来绑定this。

这样有个好处,map的存储的数据和业务处理对象可以分离,业务处理对象可以尽可能的按职责分割的明确符合SRP原则。

const output = {log: function(key, value) {console.log("Key: %s, Value: %s", key, value);}};map9.forEach(function(value, key, map) {this.log(key, value);}, output);

4. 和其它结构的互转


  • Map To Array (…map)

使用扩展运算符三个点(…)可将map内的元素都展开的数组。

const map10 = new Map();map10.set('k1', 1);map10.set('k2', 2);map10.set('k3', 3);console.log([...map10]);// [ [ 'k1', 1 ], [ 'k2', 2 ], [ 'k3', 3 ] ]

  • Array To Map (new Map(arr))

const map11 = new Map([['name', 'Aissen'],['age', 12]])console.log(map11)//Map { 'name' => 'Aissen', 'age' => 12 }

  • Map To Object (遍历map)
    写一个转换函数,遍历map的所有元素,将元素的键和值作为对象属性名和值写入Object中。

function mapToObj(map) {let obj = Object.create(null);for (let [k,v] of map) {obj[k] = v;}return obj;}const map12 = new Map().set('k1', 1).set({pa:1}, 2);console.log(mapToObj(map12))//{ k1: 1, '[object Object]': 2 }

  • Object To Map (遍历对象的属性)
    同理,再写一个转换函数便利Object,将属性名和值作为键值对写入Map。

function objToMap(obj) {let map = new Map();for (let k of Object.keys(obj)) {map.set(k, obj[k]);}return map;}console.log(objToMap({yes: true, no: false}))//Map { 'yes' => true, 'no' => false }

  • Set To Map (new Map(set))

const set = new Set([['foo', 1],['bar', 2]]);const map13 = new Map(set)console.log(map13)//Map { 'foo' => 1, 'bar' => 2 }

  • Map To Set (遍历map)

function mapToSet(map) {let set = new Set()for (let [k,v] of map) {set.add([k, v])}return set;}const map14 = new Map().set('k1', 1).set({pa:1}, 2);console.log(mapToSet(map14))//Set { [ 'k1', 1 ], [ { pa: 1 }, 2 ] }

二、set

ES6 提供了新的数据结构 Set。

1.特性

似于数组,但它的一大特性就是所有元素都是唯一的,没有重复。

我们可以利用这一唯一特性进行数组的去重工作。

在向Set加入值时,Set不会转换数据类型,内部在判断元素是否存在时用的类似于精确等于(===)的方法,“2”和2是不同的,

NaN等于其自身。正常情况下不成立

let set8 = new Set()
set8.add(NaN)
set8.add(NaN)
set8.add(2)
set8.add("2")
console.log( set8)//{NaN, 2, "2"}

2.属性和方法


  • Set 实例属性:

    • Set.prototype.constructor:构造函数,默认就是Set函数。
    • Set.prototype.size:返回Set实例的成员总数。
  • Set 实例方法:
    分为两大类:操作方法(用于操作数据):

    • add(value):添加某个值,返回 Set 结构本身。
    • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
    • has(value):返回一个布尔值,表示该值是否为Set的成员。
    • clear():清除所有成员,没有返回值。

遍历方法(用于遍历成员)
遍历操作,Set 结构的实例有四个遍历方法,可以用于遍历成员:

    • keys():返回键名的遍历器
    • values():返回键值的遍历器
    • entries():返回键值对的遍历器
    • forEach():使用回调函数遍历每个成员

3.遍历

用Set实例对象的keys(),values(),entries()方法进行遍历。

let set5 = new Set([4, 5, 'hello'])
console.log('iterate useing Set.keys()')
for(let item of set5.keys()) {console.log(item)
}console.log('iterate useing Set.values()')
for(let item of set5.values()) {console.log(item)
}console.log('iterate useing Set.entries()')
for(let item of set5.entries()) {console.log(item[0],item[1])
}

用forEach()遍历

let set = new Set([1,2,3])
set.forEach(function(value) {console.log(value);
});

4.和其他结构互转


  • Array转Set-new Set(arr)

let set2 = new Set([4,5,6])console.log('array to set 1:', set2)let set3 = new Set(new Array(7, 8, 9))//{ 4, 5, 6 }console.log('array to set 2:', set3)//{ 7, 8, 9 }

  • Set 转Array

[...set] || Array.from(set)

5.应用


  • 单一数组去重

let set6 = new Set([1, 2, 2, 3, 4, 3, 5])console.log([...set6]); //[1, 2, 3, 4, 5]console.log(Array.from(set6));//[1, 2, 3, 4, 5]

  • 多数组的合并去重

let arr1 = [1, 2, 3, 4]let arr2 = [2, 3, 4, 5, 6]let set7 = new Set([...arr1, ...arr2])console.log(Array.from(set7));//[1, 2, 3, 4, 5, 6 ]

本文链接:https://blog.csdn.net/qq_39903567/article/details/115210548


推荐阅读
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
author-avatar
海天豆浆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有