热门标签 | 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


推荐阅读
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社区 版权所有