ES6(5):セット/地図

セット:

値の配列のような、しかし、メンバーがユニークです。

集合関数は、配列(反復可能なインターフェースを有する付加的なデータ構造)を受信することができます

例// 
CONST =(1,2 ,. 3 ,. 4 ,. 4])を設定し、新しい新規SET; 
[... SET] 
// [1,2 ,. 3 ,. 4] 

//例つ
CONST商品=新しいセット( )[1,2 ,. 3 ,. 4 ,. 5 ,. 5 ,. 5 ,. 5。]; 
。items.size 5 // 

//例3 
CONST新しい新しいSET =セット(document.querySelectorAll( 'DIV')); 
set.size // 56 

//同様の
constの新しい新しいSET =セット(); 
ドキュメント
 .querySelectorAll( 'DIV')
 .forEach(= div>のset.add(DIV)); 
set.size // 56

 重複した配列を削除します。

重複した文字列を削除します

[...新しいセット( 'ababbcは')]。( '')に参加
// "ABC"

 

時間に加算値を設定し、変換のタイプはそれほど生じず、5そして"5"2つの異なる値です設定された内部は、2つの値が異なるかどうかを決定する、「同じ値ゼロ等価」と呼ばれて使用されるアルゴリズム 、 厳密な等価演算子(に類似している===)、主な違いはNaN、それ自体に等しく、かつ正確に等価オペレータNaN独自に等しくありません

また、オブジェクトに特別な注意を払う必要があります。

方法の例:

  • add(value):構造自体を設定するために返すように値を追加します。
  • delete(value):値を削除し、それが削除が成功したかどうかを示すブール値を返します。
  • has(value):値があるかどうかを示すブール値を返しますSetメンバー。
  • clear():クリアすべてのメンバー、ノーリターン値。
s.add .add(2).add(2)(1); 
// 2回添加した(注)

// 2 s.size 

(1)s.has真//の
(2)真のs.has // 
s.has // falseに(3)

s.delete(2); 
s.has(2)falseに//

 

比較対象の決意キー

//对象的写法
CONST性質= { 
  '幅':1、
  '高':1 
}。

IF(プロパティ[someNameという]){ 
  //何かを
} 

//セット的写法
CONST性質=新しいセット()。

properties.add( '幅'); 
properties.add( '高さ'); 

(properties.has(someNameという))の場合{ 
  //何かをします
}

 

(アレイおよびアレイに類似)配列にArray.from。

 

同様に拡張オペレータのキーの重複排除

 

 トラバーサル方法:

  • keys():キー歩行者の名前を返します。
  • values():リターンキーウォーカー
  • entries():キーと値のペアウォーカーを返します。
  • forEach():使用コールバック関数は、各部材を横切ります

 この方法は、多少類似オブジェクト、よりforEachのです。

キー:

keysメソッド、valuesメソッド、entriesメソッドの復帰は、訪問者オブジェクト(章の「イテレータオブジェクト」を参照)です。構造的セットキー名が存在しない、唯一のキー(またはキーの名前と値が同じ値である)ので、そうkeys方法とvalues全く同一の動作方法

あなたはとメソッドのためのforEachを使用できるように設定しSymbol.iteartorを展開しているので:

forEachこの方法は、更に有していてもよい結合の内部処理機能を表す第2のパラメータthisオブジェクト

 

扩展运算符(...)内部使用for...of循环

 

实现并集(Union)、交集(Intersect)和差集(Difference):

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}

 

改变Set结构:

// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6

// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));
// set的值是2, 4, 6

 

 WeakSet 结构:

它与 Set 有两个区别。

首先,WeakSet 的成员只能是对象,而不能是其他类型的值。其次,WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中

WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。(WeakSet 不可遍历)

 

 

 

Map:

Object 本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制.

 Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

 

const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

 

接收数组(数组转map):

 

set/map:

const set = new Set([
  ['foo', 1],
  ['bar', 2]
]);
const m1 = new Map(set);
m1.get('foo') // 1

const m2 = new Map([['baz', 3]]);
const m3 = new Map(m2);
m3.get('baz') // 3

 如果读取一个未知的键,则返回undefined:

new Map().get('asfddfsasadf')
// undefined

 1.size: 成员数

2.set(key,value): 不是put 哦

3.get(key): 获取

 4.has(key):是否在当前Map中

5.delete(key):删除某个键

6.clear:清空

 

遍历方法:(跟set一样)

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历 Map 的所有成员。

 

// 等同于使用map.entries()
for (let [key, value] of map) {
  console.log(key, value);
}

map[Symbol.iterator] === map.entries // true

 

forEach:回调函数包涵三个参数,并且本身可以有第二个参数用来绑定this

 

 

 数据结构转换

Map转数组:

 

数组转Map

Map转对象:

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

 对象转Map:

function objToStrMap(obj) {
  let strMap = new Map();
  for (let k of Object.keys(obj)) {
    strMap.set(k, obj[k]);
  }
  return strMap;
}

 

Map 转json:转换为对象后再转换为json

function strMapToJson(strMap) {
  return JSON.stringify(strMapToObj(strMap));
}

 Map 的键名有非字符串,这时可以选择转为数组 JSON。

function mapToArrayJson(map) {
  return JSON.stringify([...map]);
}

 json 转map:先转换为对象,然后再转换为map

function jsonToStrMap(jsonStr) {
  return objToStrMap(JSON.parse(jsonStr));
}

 

WeakMap:整体类似map,但是与weakset一样,不能循环,并且只接收对象作为键名,指向的对象也不计入垃圾回收机制。

用途:

let myElement = document.getElementById('logo');
let myWeakmap = new WeakMap();

myWeakmap.set(myElement, {timesClicked: 0});

myElement.addEventListener('click', function() {
  let logoData = myWeakmap.get(myElement);
  logoData.timesClicked++;
}, false);

 myElement是一个 DOM 节点,每当发生click事件,就更新一下状态。我们将这个状态作为键值放在 WeakMap 里,对应的键名就是myElement一旦这个 DOM 节点删除,该状态就会自动消失,不存在内存泄漏风险

 

おすすめ

転載: www.cnblogs.com/jony-it/p/10956671.html