es6进修之map和set

Map和Set

Map 定义:一组键值对的鸠合

它是一组键值对的数据组织,因为之前javascript的键(key)必需是字符串。为了使键可所以多种范例的因而在最新的es6中引入了map这类数据组织,如许能够加速查询速率,类似于查字典

要领和属性

var m = map() //空map
m.set('门生岁数',6 ) //增加一对新的key-value
m.has('门生岁数') //是不是存在key门生岁数 true
m.get('门生岁数') //拿到值 6
m.delete('门生岁数') // 删除key门生岁数
m.clear()    //消灭一切成员 没有返回值
m.size() // 返回map组织的成员总数 1

须要注重的是假如屡次对雷同key值插进去value,前一次的value值会被掩盖

map中的键现实是对内存地址的援用,举例说明

var k1 = 222;
var k2 = 222;
map
.set(k1, 123);
.set(k2, 222);

map.get(k1); // 123    
map.get(k2); // 222

因而假如键值是对象的话就算值雷同也是两个差别的键,假如是简朴范例的话(number,boolean,string),只需值相称,就是同一个键,0和-0也被map视为同一键,NaN也是同一键

遍历map的要领

  • keys(): 返回键名的遍历器
  • values(): 返回键值的遍历器
  • entries():返回一切成员的遍历器
  • forEach(): 遍历一切map成员

map遍历的递次就是插进去的递次

应用实例

var m = new map(
    ['F', 'no'],
    ['t', 'yes']
);

for(let key of map.keys()) {
    console.log(key);
}
// f,t

for(let key of map.values()) {
    console.log(key);
}
// no, yes

for(let key of map) {
    console.log(key[0], key[1]);
}
// f no
// t yes

map.forEach( res => {
    console.log(res[0], res[1]);
});
// f no
// t yes

forEach要领还能够接收第二个参数,用来绑定this。

范例转换

  • [ ] map怎样转换为数组

应用扩大运算符能够很轻易的转换

var m = map;
m.set('a', 1);
m.set('b', 2);

[...map];
// [['a',1], ['b',2]];
  • [ ] 数组转换为map
new Map([[true, 7], [{foo: 3}, ['abc']]])
// Map {true => 7, Object {foo: 3} => ['abc']}
  • [ ] map转化为对象

假如键都是字符串

function mapToObj(strMap) {
    let obj = Object.create(null);
    for(let [k,v] of strMap) {
        obj[k] = v
    }
    return obj;
}

let map = new Map().set('yes',111);
mapToObj(map);
// {yes: 111};
  • [ ] 对象转为map
function objToMap(obj) {
    let map = new Map();
    for(let k of obj.keys()) {
        map.set(k.obj[k]);
    }
    return map;
}

objToStrMap({yes: true, no: false});
// [ [ 'yes', true ], [ 'no', false ] ]
  • [ ] map转化为json

假如map键名都是字符串的话,能够转化为对象json

function mapToJson(strMap) {
    return JSON.stringify(mapToObj(strMap)); // map转化为对象在转化为json    
}

let map = new Map().set('yes', 111);
strMapToJson(myMap)
// '{"yes":true,"no":false}'

假如键名时非字符串的话,转化为数组json

function mapToJson1(strMap) {
    return JSON.stringify([...strMap]); //map转化为数组在转化为数组json
}

let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
mapToArrayJson(myMap)
// '[[true,7],[{"foo":3},["abc"]]]'

json转化为map同理只是return的是JSON.parse()要领 也分为键名是字符串和非字符串

Set

特性

范例于数组。然则它的成员值都是唯一的,能够用来做数组去重

组织函数

var a = new Set([1,2,2,3,4,555,5,5,6]);
[...a];
// [1,2,3,4,555,6];

这是一个数组去重的例子在set内部假如有两个NAN会去掉一个

要领

  • add(value): 增加值 返回set组织自身
  • delete(value): 删除某个值 返回布尔值 示意是不是删除胜利
  • has(value): 返回布尔值 示意该值是不是为set的成员
  • clear(): 消灭一切成员

数组去重的两种要领

var arr = [1,2,3,4,4,5];
var aSet = new Set(arr);
[...aSet];
//[1,2,3,4,5] 

var bSet = new Set(arr);
arr = Array.from(bSet); // [1,2,3,4,5]

因为set的keys()和values()完整一样所以没法经由过程set[xxx]的体式格局找到其内部的值,

遍历set的要领

  • keys(): 返回键名和遍历器
  • values(): 返回键值和遍历器
  • entires(): 返回键值对的遍历器
  • forEach(): 应用回调函数遍历每一个成员
  let set = new Set(['red', 'green', 'blue']);
  
  for (let item of set.keys()) {
    console.log(item);
  }
  // red
  // green
  // blue
  
  for (let item of set.values()) {
    console.log(item);
  }
  // red
  // green
  // blue
  
  for (let item of set.entries()) {
    console.log(item);
  }
  // ["red", "red"]
  // ["green", "green"]
  // ["blue", "blue"]

forEach对空数组不会实行回调函数

    原文作者:哈哈哈我只是想笑
    原文地址: https://segmentfault.com/a/1190000018788863
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞