前端forEach在Array、map、set中的使用,weakset,weakmap


數組:

var s = ['a','b','c'];

s.forEach(function(ele,index,array){

console.log(ele);

});

Map:

var map = new Map([[1:'a'],[2:'b'],[3:'c']]);

map.forEach(function(value,key,map){

console.log(value);

});

set:

var set = new Set(['a','b','c']);

set.forEach(function(ele,ele2,array){

console.log(ele);

});

只獲取特定的值:

var s = ['a','b','c'];

s.forEach(function(ele){

console.log(ele)

});

Set實例的屬性和方法

Set結構的實例有以下屬性。

  • Set.prototype.constructor:構造函數,默認就是Set函數。
  • Set.prototype.size:返回Set實例的成員總數。

Set實例的方法分為兩大類:操作方法(用於操作數據)和遍歷方法(用於遍歷成員)。下面先介紹四個操作方法。

  • add(value):添加某個值,返回Set結構本身。
  • delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value):返回一個布爾值,表示該值是否為Set的成員。
  • clear():清除所有成員,沒有返回值。
  • Array.from方法可以將Set結構轉為數組。

    遍歷操作

    Set結構的實例有四個遍歷方法,可以用於遍歷成員。

    • keys():返回鍵名的遍歷器
    • values():返回鍵值的遍歷器
    • entries():返回鍵值對的遍歷器
    • forEach():使用回調函數遍歷每個成員

    需要特別指出的是,Set的遍歷順序就是插入順序。這個特性有時非常有用,比如使用Set保存一個回調函數列表,調用時就能保證按照添加順序調用。

  • Map實例的屬性和方法


    遍歷方法
    Map原生提供三個遍歷器生成函數和一個遍歷方法。

    • keys():返回鍵名的遍歷器。
    • values():返回鍵值的遍歷器。
    • entries():返回所有成員的遍歷器。
    • forEach():遍歷Map的所有成員。

    需要特別注意的是,Map的遍歷順序就是插入順序。

    Map結構轉為數組結構,比較快速的方法是結合使用擴展運算符(...)。

    let 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']]
    

      

    結合數組的map方法、filter方法,可以實現Map的遍歷和過濾(Map本身沒有mapfilter方法)。

    let map0 = new Map()
      .set(1, 'a')
      .set(2, 'b')
      .set(3, 'c');
    
    let map1 = new Map(
      [...map0].filter(([k, v]) => k < 3)
    );
    // 產生Map結構 {1 => 'a', 2 => 'b'}
    
    let map2 = new Map(
      [...map0].map(([k, v]) => [k * 2, '_' + v])
        );
    // 產生Map結構 {2 => '_a', 4 => '_b', 6 => '_c'}
    

      

    與其他數據結構的互相轉換

    (1)Map轉為數組

    前面已經提過,Map轉為數組最方便的方法,就是使用擴展運算符(...)。

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

      

    2)數組轉為Map

    將數組轉入Map構造函數,就可以轉為Map。

    new Map([[true, 7], [{foo: 3}, ['abc']]])
    // Map {true => 7, Object {foo: 3} => ['abc']}
    

      

    (3)Map轉為對象

    如果所有Map的鍵都是字符串,它可以轉為對象。

    function strMapToObj(strMap) {
      let obj = Object.create(null);
      for (let [k,v] of strMap) {
        obj[k] = v;
      }
      return obj;
    }
    
    let myMap = new Map().set('yes', true).set('no', false);
    strMapToObj(myMap)
    // { yes: true, no: false }
    

      (4)對象轉為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})
    // [ [ 'yes', true ], [ 'no', false ] ]
    

      

    (5)Map轉為JSON

    Map轉為JSON要區分兩種情況。一種情況是,Map的鍵名都是字符串,這時可以選擇轉為對象JSON。

    function strMapToJson(strMap) {
      return JSON.stringify(strMapToObj(strMap));
    }
    
    let myMap = new Map().set('yes', true).set('no', false);
    strMapToJson(myMap)
    // '{"yes":true,"no":false}'
    

      

  • 另一種情況是,Map的鍵名有非字符串,這時可以選擇轉為數組JSON。

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

      

    (6)JSON轉為Map

    JSON轉為Map,正常情況下,所有鍵名都是字符串。

    function jsonToStrMap(jsonStr) {
      return objToStrMap(JSON.parse(jsonStr));
    }
    
    jsonToStrMap('{"yes":true,"no":false}')
    // Map {'yes' => true, 'no' => false}
    

      

    但是,有一種特殊情況,整個JSON就是一個數組,且每個數組成員本身,又是一個有兩個成員的數組。這時,它可以一一對應地轉為Map。這往往是數組轉為JSON的逆操作。

    function jsonToMap(jsonStr) {
      return new Map(JSON.parse(jsonStr));
    }
    
    jsonToMap('[[true,7],[{"foo":3},["abc"]]]')
    // Map {true => 7, Object {foo: 3} => ['abc']}
    

      

    WeakSet

    WeakSet結構與Set類似,也是不重復的值的集合。但是,它與Set有兩個區別。

    首先,WeakSet的成員只能是對象,而不能是其他類型的值。

    其次,WeakSet中的對象都是弱引用,即垃圾回收機制不考慮WeakSet對該對象的引用,也就是說,如果其他對象都不再引用該對象,那么垃圾回收機制會自動回收該對象所占用的內存,不考慮該對象還存在於WeakSet之中。這個特點意味着,無法引用WeakSet的成員,因此WeakSet是不可遍歷的。


    WeakMap 

    WeakMap結構與Map結構基本類似,唯一的區別是它只接受對象作為鍵名(null除外),不接受其他類型的值作為鍵名,而且鍵名所指向的對象,不計入垃圾回收機制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM