Js 数组去重

Js 数组去重

探讨几种数组去重的方法,多几个思路和解题方法终归是好的。

一、双循环for嵌套 (ES5常用)

比较简单的方法,外层循环元素,内层循环检查是否重复,当有重复的值时,就删除掉。
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
    
    function unique(arr) {
      for (var i = 0; i < arr.length; i++) {
        for (var j = i + 1; j < arr.length; j++) {
          if (arr[i] === arr[j]) { // 如果有重复值
            arr.splice(j, 1); // splice方法删除重复值
            // 删除后会改变数组长度,下标减1
            j--;
          }
        }
      }
      return arr;
    }
    console.log(unique(arr));
// 1. 会返回去重后的原数组
// 2. ["true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]
// 3. NaN 和 {} 没有去除
// 4. 如果数组很长,这种方法占用内存很高,效率最低

二、indexOf去重 (ES5常用)

var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
    
    function unique(arr) {
      if (!Array.isArray(arr)) {
        console.log('type error!');
        return
      }
      var newArr = [];  // 新建一个空数组
      for (var i = 0; i < arr.length; i++) { // 循环原数组
        if (newArr.indexOf(arr[i]) == -1) { // 判断新数组newArr里是否存在循环的arr[i]的值,如果有则跳过
          newArr.push(arr[i]); // 没有就push进新数组
        }
      }
      return newArr;
    }
    console.log(unique(arr));
// 1. 返回新数组
// 2. [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0,。 "a", {…}, {…}]
// 3. NaN 和 {} 没去重
// 4. 效率相对较高

三、ES6的Set数据结构特性

var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
    
    function unique(arr) {
      return Array.from(new Set(arr));  // Set里的成员具有唯一性
    }
    console.log(unique(arr));
// 1. 返回去重后的新数组
// 2. [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
// 3. {} 无法去重
// 4. 性能高

四、对象属性key唯一的特性去重

    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];

    function unique(arr) {
      var obj = {}
      var newArr = []

      for (var i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) {
          obj[arr[i]] = 1
          newArr.push(arr[i])
        }
      }
      return newArr
    }
    console.log(unique(arr))
// 1. 返回去重后的原数组。
// 2. [1, "true", 15, false, undefined, null, NaN, 0, "a", {…}]
// 3. true和'NaN'消失
// 4. 性能很高
// 5. 最好保证类型可控
方法大都类似,以上几种算是较常用的,see you。
posted @ 2020-01-08 20:30  地灵  阅读(156)  评论(0)    收藏  举报