玖叶教程网

前端编程开发入门

ES2015-SET&MAP 笔记(essetntial)

set

  • 值总是唯一的
  • 使用数组创建set可以实现过滤 keys()返回值和values()一致

迭代-类lambda操作
foreach
for … of

set、array 转换
let myArr = Array.from(mySet);
let mySet = new Set(myArray);

reverse
不能直接reverse,可以借助array.reverse实现

主要方法
add
clear
delete-直接delete value
entries -和map一样返回keys和values(KEY==VALUE)
foreach
has
keys/values

测试代码

let myArray = ["value1", "value2", "value3"];

// 用Set构造器将Array转换为Set
let mySet = new Set(myArray);

for (let item of mySet) console.log(item);

// 用forEach迭代
mySet.forEach(function(value) {
  console.log(value);
});

for (let item of mySet) console.log(item);

// 按顺序输出:1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}
for (let item of mySet.keys()) console.log(item);

// 按顺序输出:1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}
for (let item of mySet.values()) console.log(item);

// 按顺序输出:1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}
//(键与值相等)
for (let [key, value] of mySet.entries()) console.log(key);



let text = 'India';

let myArr = Array.from(mySet);
console.log(myArr);


let myStringSet = new Set(text);  // Set {'I', 'n', 'd', 'i', 'a'}
console.log(myStringSet.size);  // 5

set1 = new Set([1, 2, 3, 4]);

set2 = new Set([7, 2, 3, 4]);


// 可以通过如下代码模拟求交集
let intersection = new Set([...set1].filter(x => set2.has(x)));

for (let [key, value] of intersection.entries()) 
    console.log("intersection="+key);

// 可以通过如下代码模拟求差集
let difference = new Set([...set1].filter(x => !set2.has(x)));
for (let [key, value] of difference.entries()) 
    console.log("difference="+key);

function pop(set) {
  const last = [ ...set ].pop();
  set.delete(last);
  return last;
}

function shift(set) {
  const first = [ ...set ].shift();
  set.delete(first);
  return first;
}

function sendFirstToBack(set) {
  const arr = [ ...set ];
  arr.push( arr.shift() );
  return new Set(arr);
}

function reverse(set) {
  const arr = [ ...set ].reverse();
  set.clear()
  
  for( const item of arr)
    
    {  
set.add(item);}
      
}
 
for (let [key, value] of set2.entries()) 
    console.log("set2="+key);
  reverse(set2)

for (let [key, value] of set2.entries()) 
    console.log("reverse="+key); 

weakset

成员都是对象
成员都是弱引用,可以被垃圾回收机制回收

var ws = new WeakSet();
let foo = {ww: "wwww"};
var bar = {};

ws.add(foo);
ws.add(bar);

ws.has(foo);    // true
ws.has(bar);   // true

  foo =  null
 // 从set中删除 foo 对象
console.log(ws.has(foo));    // false, foo 对象已经被删除了
console.log(ws.has(bar));    // true, bar 依然存在

不能遍历,方法有 add、delete、has
只要该元素对象没有被除WeakSet以外的其他对象引用,就会被垃圾回收释放
clear方法已经不支持

map

主要方法
和set相似
set(key, value);
clear
delete
forEach
get
has
keys
values

NaN 也可以作为Map对象的键

myMap.set(NaN, “not a number”);
myMap.get(NaN); // “not a number”
迭代-类lambda操作
foreach
for … of
Map 与数组的关系
使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
合并map
使用… spread 合并
测试代码

 
let first = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

let second = new Map([
  [1, 'uno'],
  [2, 'dos']
]);

// 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
// 展开运算符本质上是将Map对象转换成数组。
let merged = new Map([...first, ...second]);

let kvArray = [["key1", "value1"], ["key2", "value2"]];

// 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
let myMap = new Map(kvArray);

myMap.get("key1"); // 返回值为 "value1"

// 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
console.log(Array.from(myMap)); // 输出和kvArray相同的数组

// 更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);

// 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]

  

//OBJECT TO MAP
const myObjMap = { foo: 'bar' }
const myObjectMap = new Map(Object.keys(myObjMap).map(key => [ key, myObjMap[key] ]))
console.log("objectMap="+[...myObjectMap])

function strMapToObj(strMap){
    let obj= Object.create(null);
    for (let[k,v] of strMap) {
    obj[k] = v;
}
    return obj;
}
let obj= Object.create(null);
Object.assign(obj,myObjectMap)
console.log(obj)
obj= strMapToObj(myObjectMap)
console.log(obj)
object2map
//OBJECT TO MAP
const myObjMap = { foo: 'bar' }
const myObjectMap = new Map(Object.keys(myObjMap).map(key => [ key, myObjMap[key] ]))
console.log("objectMap="+[...myObjectMap])

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

weakmap

键是弱引用的。其键必须是对象,而值可以是任意的
clear方法已经不支持,变通办法:

 clear() {
    this._wm = new WeakMap()
  }

只要该元素对象没有被除WeakSet以外的其他对象引用,就会被垃圾回收释放
不能遍历,方法有 set、delete、has

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言