数组去重

160 阅读1分钟

数组去重

1. 利用for嵌套for,然后splice去重

function unique(arr) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    for (var j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        j--; // 每删除一个数j的值就减1
        len--; // j值减小时len也要相应减1(减少循环次数,节省性能)   
      }
    }
  }
  return arr;
}

2. indexOf(JavaScript 版本: 1.6 )

array.indexOf(item,start) 方法可返回数组中某个指定的元素位置,如果在数组中没找到指定元素则返回 -1。

function unique_indexOf(arr) {
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    let item = arr[i];
    if (newArr.indexOf(item) === -1) {
      newArr.push(item);
    }
  }
  return newArr;
}

3. filter(JavaScript 版本: 1.6 )

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。filter() 不会改变原始数组。

function unique_filter(arr) {
  return arr.filter(function (item, index) {
    // 当前元素的在数组中的第一个索引等于当前索引,返回该元素
    return arr.indexOf(item) === index;
  })
}

4.sort(相邻元素对比)(JavaScript 版本: 1.1 )

function unique_sort(arr) {
  let newArr = arr.sort();
  for (let i = 0; i < newArr.length; i++) {
    if (newArr[i]===newArr[i+1]) {
      newArr.splice(i+1,1);
    }
  }
  return newArr;
}

5. includes(ECMAScript 6)

includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。

function unique_includes(arr) {
  if (!Array.isArray(arr)) {
    console.log('type error!');
    return
  }
  let newArr = [];
  for (let i = 0; i < arr.length; i++) {
    let item = arr[i];
    if (!newArr.includes(item)) {
      newArr.push(item);
    }
  }
  return newArr;
}

6. Set(ECMAScript 6)

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

function uniqueSet(arr) {
  return Array.from(new Set(arr))
  //或者:return [...new Set(arr)]
}