Set&Map

187 阅读3分钟

Set

集合型的数据结构

类似于数组set的值是唯一的,只有元素的键,没有值(键就是值,值就是键)。不能使用索引来获取元素(以上特点符合集合的概念)。

属性

size ——返回集合中所有不重复元素的个数值

let set1 = new Set([1, "洋葱", 3, 4, "洋葱", 5, 5])
console.log(set1.size);//结果:5

方法

add()

  • 添加某个值,返回set本身(可以使用链式调用:set.add().add()
   let set1 = new Set([1, "洋葱", 3, 4, 5])
   set1.add(4).add(8).add(9);//链式调用
   console.log(set1);

delete()

  • 删除某个值,删除成功返回true,删除失败返回false
let set1 = new Set([1, "洋葱", 3, 4, 5])
    console.log(set1.delete(7));//flase
    console.log(set1.delete(3));//true

has()

  • 判断是否含有某个值,可以返回一个布尔值
 let set1 = new Set([1, "洋葱", 3, 4, 5])
 console.log( set1.has(5));//true

clear

  • 清空所有元素 遍历
  • 可以使用for Each 或者 for of遍历
//注意和遍历数组的区分,index并不代表数组的索引(因为set是集合型数据结构,值唯一,所以遍历的时候查找的是值也可以称作键)
 let set1 = new Set([1, "洋葱", 3, 4, 5])
    set1.forEach((item,index)=>{
      console.log(item);
      console.log(index);
    })
  let set1 = new Set([1, "洋葱", 3, 4, 5])
    for (const item of set1) {
      console.log(item);
    }

Map

字典型的数据结构

Map 中存储的map的结构是 “键:值 (K:V)” , 其中的  和  可以是任何类型的。 Map可以有重复的值,但是不能有重复的键。

属性

size ——键值对的个数

方法

  • set(k,v) 添加一个键值对
  • var v = get(k) 通过键,获取值。
  • delete 通过键,删除一个键值对
  • clear 清空

遍历

//定义一个Map对象
const map = new Map([
  ['name', "洋葱"],
  ['age', 7],
])
//`keys()`返回键名
for (let key of map.keys()) {
  console.log(key)//  "name" "age"
}
//values()返回值
for (let value of map.values()) {
  console.log(value)//洋葱  7
}
// "for....of.... "和"entries()"遍历键值对
for (let item of map.entries()) {
  console.log(item)//name:洋葱 age:7
}
// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value)
}
//### for...of...遍历map等同于使用map.entries()
for (let [key, value] of map) {
  console.log(key, value)
}
//"for.....each....."遍历键值对
 map.forEach((v,k)=>{
      console.log("v=>"+v);//结果:v=>7 
      console.log("k=>"+k);//结果:k=>洋葱
    })

英汉词典案例(数据在本地)

需求:输入英文单词从本地数据库中得到对应汉语意思

<div id="dict">
    <input type="text" id="word" placeholder="请输入英文单词">
    <div id="desc"></div>
  </div>
  <script src="js/dict.js"></script>
 window.onload = function () {
      //将字符串按照换行进行分割
      let arr = word.split("\n");
      //两两分成一组。 第一行 是 key 第二行是value
      let map = new Map();
      for (var i = 0; i < arr.length - 1; i += 2) {
        //获取 单词 不留前一个#
        let inpword = arr[i].substring(1);
        //获取 翻译  不留前6个字符
        let desc = arr[i + 1].substring(6);
        map.set(inpword, desc);
      }
      // 输入框只要有输入的内容,就开始查询
      const inp = document.getElementById('word');
      const desc = document.getElementById('desc');
      inp.oninput = function () {
        //获取输入框的值,根据值去map中查询。
        let value = map.get(inp.value.trim());
        //如果输入框有值则
        if (value) {
          desc.innerHTML = value;
        } 
        //否则
        else {
          desc.innerHTML = "查无此词";
        }
      }
    }

引入的js/dict.js数据格式为

微信截图_20211125193650.png

总结

Set

  • 集合的数据结构(ES6新增),Array.from 方法可以将 Set 结构转为数组
  • 成员唯一、无序且不重复
  • [value, value]只有键值,没有键名
  • 可储存任何类型的唯一值
  • 可以遍历,方法有:adddeletehasclear,可以间接使用数组的方法 Map
  • 字典数据结构,本质上是键值对的集合
  • 可以遍历,可以进行结构转换
  • 方法有:setgethasdeleteclear 结构类型转换
//map转数组
let map = new Map()
let arr = [...map]
//数组转map
Map: map = new Map(arr)
//map转对象
let obj = {}
for (let [k, v] of map) {
  obj[k] = v
}
//对象转为 Map
for( let k of Object.keys(obj)){
  map.set(k,obj[k])
}