JavaScript 实现数组去重(支持根据数组对象属性值来去重)

130 阅读1分钟

通用函数

以下支持普通数组与数组对象属性值去重

function unique(arr, prop) {
  return arr.filter((v, index) => {
    return prop
      ? arr.findIndex(fv => fv[prop] === v[prop]) === index
      : arr.indexOf(v) === index
  })
}

以下是几种去重的方式:

只保留取第一个值 (ES5 推荐) (适用于普通数组)

function unique(arr) {
  return arr.filter(function(v, index) {
    return arr.indexOf(v) === index
  })
}

根据数组对象中的属性值去重(推荐)(适用于对数组对象属性值)

function unique(arr, prop) {
  return arr.filter((v, index) => {
    return arr.findIndex(fv => fv[prop] === v[prop]) === index
  })
}

使用 ES6 的 Set 方法 (ES6 推荐) (适用于普通数组)

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

声明新数组,遍历新数组看是否存在值

function unique(arr) {
  let res = [arr[0]]
  for (let i = 0; i < arr.length; i++) {
    let isExist = false
    for (let j = 0; j < res.length; j++) {
      if (arr[i] === res[j]) {
        isExist = true
        break
      }
    }
    if (!isExist) {
      res.push(arr[i])
    }
  }
  return res
}

声明新数组,排序后,遍历看是否与新数组最后一个值相等

function unique(arr) {
  let newArr = arr.sort((a, b) => a - b)
  let res = [newArr[0]]
  for (let i = 0; i < newArr.length; i++) {
    if (newArr[i] !== res[res.length - 1]) {
      res.push(newArr[i])
    }
  }
  return res
}

声明新数组与新对象,判断对象属性是否存在

function unique(arr) {
  let res = []
  let obj = {}
  for (let i = 0; i < arr.length; i++) {
    if (!obj[arr[i]]) {
      obj[arr[i]] = true
      res.push(arr[i])
    }
  }
  return res
}

声明新数组, indexOf 或 lastIndexOf 判断值是否存在于新数组中

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

声明新数组,includes 判断值是否存在于新数组中

function unique(arr) {
  let res = []
  for (let i = 0; i < arr.length; i++) {
    if (!res.includes(arr[i])) {
      res.push(arr[i])
    }
  }
  return res
}

map 返回新数组,includes 过滤存在的

function unique(arr) {
  let res = []
  res = arr.map(item => {
    return res.includes(item) ? false : item
  })
  return res
}

原文链接: github.com/liurongqing…