セットとMapデータ構造

5592 ワード

一、ES 6は新しいデータ構造Setを提供します.配列に似ていますが、メンバーの値は全部唯一で、重複した値はありません.map(巡回巡回巡回配列)と組み合わせることもできます.filter(フィルタ配列)は使用できます.
 1:
const set = new Set([1, 2, 3, 4, 4]);
console.log( [...set] )   // [1,2,3,4]

 2:
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
console.log( items )    // [1,2,3,4,5]
console.log( items.size )    // 5
1.1、配列除去の重複メンバー[...new Set(array)]
let arr = [1,2,3,4,4,5,5,7,1,2,3,8]
let a1 = [...new Set(arr)]
console.log( a1 );    //[1,2,3,4,5,7,8]
1.2、Setの2つのオブジェクトはいつも同じではありません.2つの空のオブジェクトは等しくないので、それらは2つの値とみなされます.
let set = new Set();
set.add({});
set.size // 1
set.add({});
set.size // 2
二、操作方法(データ操作用)--add(value): , Set 。--delete(value): , , 。--has(value): , Set 。--clear(): , 。2.1、Aray.from方法はSet構造を配列に変えることができる.
const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);
console.log( items );    // Set { 1, 2, 3, 4, 5 }
console.log( array );    // [ 1, 2, 3, 4, 5 ]


        
function dedupe(array) {
    return Array.from(new Set(array));
};
dedupe([1, 1, 2, 3]) // [1, 2, 3]
三、メンバーを巡回する方法--keys(): --values(): --entries(): --forEach():
let set = new Set(['red', 'green', 'blue']);
--keys():
    for (let item of set.keys()) {
        console.log(item);    // red  green  blue
    };

--values():
    for (let item of set.values()) {
      console.log(item);    // red  green  blue
    };

--entries():
    for (let item of set.entries()) {
      console.log(item);
    };
    // ["red", "red"]
    // ["green", "green"]
    // ["blue", "blue"]

--forEach();
    set = new Set([1, 4, 9]);
    set.forEach(
        (value, key) => {
            console.log(key + ' : ' + value)
        }
     )
    // 1 : 1
    // 4 : 4
    // 9 : 9
四、mapとfilterの方法はSetに使われます.
--map         
    let set = new Set([1, 2, 3]);
    set = new Set([...set].map(x => x * 2));
    //   Set  :{2, 4, 6}

--filter     
    let set = new Set([1, 2, 3, 4, 5]);
    set = new Set([...set].filter(x => (x % 2) == 0));
    //   Set  :{2, 4}
4.1、セットの統合(ユニオン)、インターリーブ(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}
五、Map
5.1、対象に類似していて、キーパッドのペアのセットでもあるが、キーの範囲は文字列に限定されず、各種類の値(対象を含む)はキーとして使用することができる.つまり、Object構造は「文字列ー値」の対応を提供し、Map構造は「値ー値」の対応を提供し、より完璧なHash構造の実現である.もしあなたが「キーペア」のデータ構造が必要ならば、MapはObjectよりもっと適しています.
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
5.2、同じキーに複数の値を割り当てると、後の値が前の値をカバーします.
const map = new Map();
map
  .set(1, 'aaa')
  .set(1, 'bbb');

map.get(1) // "bbb"
5.3、注意してください.同じオブジェクトに対する参照だけが、Map構造は同じキーと見なされます.この点は非常に注意してください.
const map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined

     set get  ,         ,         ,         ,  get        ,  undefined。


const map = new Map();
const k1 = ['a'];
const k2 = ['a'];
map
  .set(k1, 111)
  .set(k2, 222);
map.get(k1) // 111
map.get(k2) // 222

  k1 k2      ,      Map          。
5.4、実例の属性と操作方法
--size();     Map        
    const map = new Map();
    map.set('foo', true);
    map.set('bar', false);
    map.size // 2

--set(key, value);    key      value,       Map   。
    let map = new Map()
        .set(1, 'a')
        .set(2, 'b')
        .set(3, 'c');
        // set         Map  ,          。

--get(key)  key     ,     key,  undefined。
    const m = new Map();
    const hello = function() {console.log('hello');};
    m.set(hello, 'Hello ES6!') //     
    m.get(hello)  // Hello ES6!

--has(key);       ,           Map     。
    const m = new Map();
    m.set('edition', 6);
    m.set(262, 'standard');
    m.set(undefined, 'nah');
    m.has('edition')     // true
    m.has('years')       // false
    m.has(262)           // true
    m.has(undefined)     // true

--delete(key);     ,  true。      ,  false。
    const m = new Map();
    m.set(undefined, 'nah');
    m.has(undefined)     // true
    m.delete(undefined)
    m.has(undefined)       // false

--clear();      ,     。
    let map = new Map();
    map.set('foo', true);
    map.set('bar', false);
    map.size // 2
    map.clear()
    map.size // 0
5.5、エルゴード方法--keys(): 。--values(): 。--entries(): 。--forEach(): Map 。5.6、Map構造を配列構造に変換し、比較的速い方法は拡張演算子(…)を使用することである.
const map = new Map([
    [1, 'one'],
    [2, 'two'],
    [3, 'three']
]);

[...map.keys()]    // [1, 2, 3]
[...map.values()]    // ['one', 'two', 'three']
[...map.entries()]    // [[1,'one'], [2, 'two'], [3, 'three']]
[...map]    // [[1,'one'], [2, 'two'], [3, 'three']]