关于ES6的set和map的使用记录

92 阅读2分钟

set

set是ES6的一种类对象数据结构,内部元素不能重复

生成set
let s = new Set()
let s = new Set([1, 2, 3, 4])
添加数据
s.add('hello')
s.add('goodbye')
s.add('hello').add('goodbye')
复制代码

Set 数据结构不允许数据重复,所以添加重复的数据是无效的

删除数据
// 删除指定数据
s.delete('hello') // true
// 删除全部数据
s.clear()
// 判断是否包含数据项,返回 true 或 false s.has('hello') // true 
// 计算数据项总数 s.size // 2
//字符串去重
let str = "352255"; let unique = [...new Set(str)].join(""); // 352
//  set去重

const arr = [1, 1, 1, 1, , 1, 1]
const delArr = new Set(arr) // 去重

// 合并去重

const arr2 = [1, 2, 3, 4]
const arr3 = [4, 5, 6, 1]

const delArr2 = new Set([...arr2, arr3])

// 交集
// 交集两个都有 取一个判断就OK
const arr4 = [8, 9, 10]
const arr5 = [11, 7, 9]

const set4 = new Set(arr4)
const set5 = new Set(arr5)
const mergeSet = arr4.filter(i => {
    return set5.has(i)
})


// 差集 
// 第一个有第二个没有 第二个有第一个没有
const arr1 = [1, 2, 3, 4]
const arr2 = [4, 5, 6, 7, 1, 1]
let arr3 = new Set(arr1.filter(item => !s2.has(item)))
let arr4 = new Set(arr2.filter(item => !s1.has(item)))
console.log(arr3)
console.log(arr4)
console.log([...arr3, ...arr4])

//  set去重

const arr = [1, 1, 1, 1, , 1, 1]
const delArr = new Set(arr) // 去重

// 合并去重

const arr2 = [1, 2, 3, 4]
const arr3 = [4, 5, 6, 1]

const delArr2 = new Set([...arr2, arr3])

// 交集
// 交集两个都有 取一个判断就OK
const arr4 = [8, 9, 10]
const arr5 = [11, 7, 9]

let s1 = new Set(arr4)
let s2 = new Set(arr5)
let result = new Set(arr4.filter(item => s2.has(item)))
console.log(Array.from(result))


// 差集 
// 第一个有第二个没有 第二个有第一个没有
const arr1 = [1, 2, 3, 4]
const arr2 = [4, 5, 6, 7, 1, 1]
let arr3 = new Set(arr1.filter(item => !s2.has(item)))
let arr4 = new Set(arr2.filter(item => !s1.has(item)))
console.log(arr3)
console.log(arr4)
console.log([...arr3, ...arr4])

map

生成map
let s = new Map() 
//设置map的内值
s.set(1,'one').set(2,'two')
const map = new Map([[1,'one'],[2,'two']])
 //console.log(map.get(1));

关于对Map对象输出数组的扩展操作
     const map = new Map([[1,'one'],[2,'two']])
     console.log(map.get(1));
     console.log([...map.keys()]);// [1, 2]
     console.log([...map.values()]);//['one', 'two']
     console.log([...map]);//[[1, 'one'],[2,'two']]
     //其中要对Map对象 进行数组的操作方式可以以以上方法转换再执行遍历
     const  map1 = new Map([[...map0].filter(([k,v]) => {return k < 3})])
     //传参测试
      let  map2 = new Map([[...map0].filter(([k,v]) => {
      console.log([k,v]);
      return k < 3})])
      //[1, 'a'],[2, 'b'],[3, 'c']
数组与Map的互相转换
数组转Map
let test =    new Map([
      [true, 7],
      [{ foo: 3 }, ["abc"]],
    ]);
    console.log(test);

image.png

Map转数组

 const myMap = new Map().set(true,7).set({foo:3},['abc'])
    console.log([...myMap])// [[true,7],[[foo,3],['abc]]]
Map转对象

当Map所有键都是字符串,可转为对象


 const myMap = new Map().set('test',7).set('sasa',"sasasa")
    let res = this.strMapToObj(myMap)
    console.log(res )//{test: 7, sasa: 'sasasa'}
    
    //方法
  strMapToObj(strMap){
      let obj = Object.create(null);
      for (let  [k,v] of strMap){
        obj[k] = v
      }
      return obj
    }
    
对象转Map
      let obj = {yes:1,no:0}
    let res =  this.objToStrMap(obj)
    console.log(res )//Map(2) {'yes' => 1, 'no' => 0}
    
    ///方法
     objToStrMap(obj){
      let strMap = new Map()
      for (let k of Object.keys(obj)){
        strMap.set(k,obj[k])
      }
      return strMap
    }