1. 程式人生 > >Set和Map數據

Set和Map數據

%s define value 聲明 map itl bject fine 字符

es6新的數據結構

1.Set:構造函數

const s = new Set ([1,2,3]);
console.log(s)//Set(3){1,2,3};
[...s];//[1,2,3]
console.log(s);//
Set(3){1,2,3};
s.add(4);//Set(4){1,2,3,4};
s.size;//4;
s.has(1);//true
s.delete(2);
s.clear();//Set(0){}

用於數組去重

let arr=[1,2,1];
arr = [...Set(arr)]//[1,2]
//Set裏NaN與NaN相等
let set = new Set();
set.add(NaN);
set.add(NaN);
set.size//1

Set遍歷操作

keys():返回鍵名的遍歷器

values():返回鍵值的遍歷器

entries():返回鍵值對的遍歷器

forEach():使用回調函數遍歷成員

//keys():
let set = new Set([11,2,3,4]);
for(let item of set.keys()){
    console.log(item)
}
//11,2,3,4
//values():
for (let val of set.values()){
    console.log(val)
}
//11,2,3,4
//entries():
for (let item of set.entries()){
     console.log(item)  
}
//[11,11];[2,2];.... //forEach set.forEach((val)=>{console.log(val)})

還可以使用for... of

for (let val of set){
    console.log(val)
}

Map:可以使用非字符串作為鍵

//對象只允許使用字符串作為鍵;否則
var obj={a:1,b:2};
var ar={};
ar[obj]=2;
console.log(ar);//{[object Object]: 2}
//Map
const map=new Map();
map.set(NaN,123);
map.get(NaN);//123
//undefined和null不相等 map.set(obj,
2);//key:{name: "joe", say: ?};value:2 map.get(obj);//2 map.has(obj);/true map.delete(obj);//true map.delete(ofo);//報錯 map.delete(ar);//false
map.clear();
map.size//0
//數組生成新的map
const mvp = new Map([‘name‘,‘joe‘],[‘title‘,‘silence‘]);
mvp.size;//2
mvp.has(‘name‘)//true
mvp.get(‘name‘)//joe
//Set和Map生成新的Map
const set = new Set([[‘foo‘,1],[‘bar‘,2]]);
const m1 = new Map(set);
m1.get(‘foo‘)//1

遍歷方法

const map = new Map ([[‘name‘,‘joe‘],[‘say‘,‘hello‘]]);
//keys()
for (let key of map.keys()){
    console.log(key)//name;say
}
//values()
//entries()
for (let item of map.entries()){
    console.log(item)//會把鍵和值放在一個數組裏
}
//forEach
map.forEach()

Map轉為數組結構

const map=new Map([
    [1,‘0ne‘],
    [2,‘two‘],
    [3,three]
])
[...map.keys]
[...map.values]
[...map.entries]
[...map)

Map和數組方法

const map0 = new Map()
    .set(1,‘a‘)
    .set(2,‘b‘)
    .set(3,‘c‘);
const map1=map0.filter(([key,value])=>{
    return key>2
})
類比使用數組map方法
const map=new Map([[‘e1‘,‘a‘],[‘e2‘,‘b‘]])
map.forEach(function(value, key, map) {
  console.log("Key: %s, Value: %s", key, value);
});//Key: e1, Value: a;Key: e2, Value: b

forEach接收第二個參數用來綁定this

const reporter={
    report:function(key,value){
        console.log("Key:%s,Value:%s",key,value);
    }
}
const map=new Map([[‘e1‘,‘a‘],[‘e2‘,‘b‘]]);
map.forEach(function(value,key,map){
    this.report(key,value)
},reporter)
//聲明一個對象reporter裏面包含著對map遍歷的變量的處理,在對map進行forEach遍歷的時候,傳入第二個變量即reporter,可以在forEach函數中使用this.reporter對其中的變+量進行處理

Map轉換

//Map轉為數組
const map= new Map()
    .set(‘e1‘,2)
    .set({foo:3},[‘abc‘]);
[...myMap]//[[‘e1‘,2],[{foo:3},[‘abc‘]]]
//數組轉Map
const map=new Map([[1,2],[2,3]])
//Map轉為對象
function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

const myMap = new Map()
  .set(‘yes‘, true)
  .set(‘no‘, false);
strMapToObj(myMap)
// { yes: true, no: false }
//對象轉為Map
function objToStrMap(obj) {
  let strMap = new Map();
  for (let k of Object.keys(obj)) {
    strMap.set(k, obj[k]);
  }
  return strMap;
}

objToStrMap({yes: true, no: false})

Set和Map數據