JS数组去重的方法

138 阅读1分钟

ES6中的Set 和 Map

  1. Set

    Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是 唯一 的。

     let myArray = ['value1', 'value2', 'value3', 'value1', 'value2',];
     let mySet = new Set(myArray);
     let newArray = Array.from(mySet);
    
     console.log(newArray); // ["value1", "value2", "value3"]
    

    可以简化一下

    let myArray = ['value1', 'value2', 'value3', 'value1', 'value2',];
    let newArray = [...new Set(myArray)];
    
    console.log(newArray); // ["value1", "value2", "value3"]
    

    缺点

    对象不可以去重

  2. Map

     let myArray = ['value1', 'value2', 'value3', 'value1', 'value2'];
     let myMap = new Map();
     let newArray = myArray.filter((val) => !myMap.has(val) && myMap.set(val, 1));
    
     console.log(newArray); // ["value1", "value2", "value3"]
    

    改进一下,支持对象去重(正则表达式还是有点问题)

     let myArray = [1, '2', 'value3', 1, '2', null, null, NaN, NaN, {"key": "value"}, {"key": "value"}, [1, 2], [1, 2]];
     let myMap = new Map();
     let newArray = myArray.filter((val) => !myMap.has((typeof val + JSON.stringify(val))) && myMap.set(typeof val + JSON.stringify(val), 1));
    
     console.log(JSON.stringify(newArray));
      // [1,"2","value3",null,null,{"key":"value"},[1,2]]
      // 注释:JSON.stringify 把 NaN 转为了null所以出现了以上结果
      // 实际结果是: [1, "2", "value3", null, NaN, {"key": "value"}, [1,2]]
    
     console.log(JSON.stringify(Array.from(myMap)));
      // [["number1",1],["string\"2\"",1],["string\"value3\"",1],["objectnull",1],["numbernull",1],["object{\"key\":\"value\"}",1],["object[1,2]",1]]
    

相关文章:

冴羽的博客: 《JavaScript专题之数组去重》

Set的唯一性通过Object.is方法判断。相关文档【Set】【Object.is】