方法一:双重循环

function unique(array) {
  if (array === null || !isArray(array)) return [];
  // res用来存储结果
  var res = [];
  var resLength = res.length;
  var arrLength = array.length;
  for (var i = 0; i < arrLength; i++) {
    for (var j = 0, j < resLength; j++ ) {
      if (array[i] === res[j]) {
        break;
      }
    }
    // 如果array[i]是唯一的,那么执行完循环,j就应该等于resLength
    if (j === resLength) {
      res.push(array[i])
    }
  }
  return res;
}

方法二:单循环 + indexOf

function unique(array) {
  if (array === null || !isArray(array)) return [];
  // res用来存储结果
  var res = [];
  var resLength = res.length;
  var arrLength = array.length;
  for (var i = 0; i < arrLength; i++) {
    if (res.indexOf(array[i]) === -1) {
      res.push(array[i]);
    }
  }
  return res;
}

方法三:先排序再去重

function unique(array) {
  // res用来存储结果
  var res = [];
  var sortedArray = array.concat().sort();
  var sortedArrayLength = sortedArray.length;
  var seen;
  for (var i = 0; i < sortedArrayLength; i++) {
    // 如果是第一个元素或者相邻的元素不相同
    if (!i || seen !== sortedArray[i]) {
      res.push(sortedArray[i]);
    }
    seen = sortedArray[i];
  }
  return res;
}

方法四:利用Object 的属性不唯一特性去重

function unique(array) {
  var obj = {}; // obj用来存储数组值组成的对象
  var res = []; // res用来存储结果
  var arrLength = array.length;
  for (var i = 0; i < arrLength; i++) {
    if (!obj.hasOwnProperty(array[i])) {
      res.push(array[i]);
      obj.array[i] = true;
    }
  }
  return res;
}

方法五:使用 ES5 新增 filter 函数

function unique(array) {
  var res = array.filter(function (item, index, array) {
    //indexOf判断的是第一次出现的位置,如果重复话位置就不对,就会返回false
    return array.indexOf(item) === index;
  });
  return res;
}

方法六:使用 ES6 新增数据结构 Set 和 Map

set结构实现:

function unique(array) {
  return Array.from(new Set(array));
}

map结构实现:

function unique(arr) {
  const seen = new Map();
  return arr.filter((item) => !seen.has(item) && seen.set(item, true));
}