Skip to content

数组去重

indexOf

js
function unique (arr) {
  return arr.filter((item, index) => arr.indexOf(item) === index)
}

indexOf 底层用 === ,所以认为 NaN !== NaN,所以 NaN 会被过滤,无论有没有重复

Set

js
function unique(arr) {
	return [...new Set(arr)]
}

键值对方法

js
function unique (arr) {
  const obj = {}
  return arr.filter(item => {
    return obj.hasOwnProperty(item) ? false : (obj[item] = true)
  })
}

区分类型,比如 1 和 '1'

js
function unique (arr) {
  const obj = {}
  return arr.filter(item => {
    const key = typeof item + item
    return obj.hasOwnProperty(key) ? false : (obj[key] = true)
  })
}

区分是不是同一个对象

js
function unique (arr) {
  const obj = {}
  return arr.filter(item => {
    const key = typeof item + JSON.stringify(item)
    return obj.hasOwnProperty(key) ? false : (obj[key] = true)
  })
}

对于正则不能判断,应为 JSON.stringify 后都是 {}

测试

js
[1, 1, '1', '1', null, null, undefined, undefined, new String('1'), new String('1'), /a/, /a/, NaN, NaN];

方法结果说明
indexOf[1, "1", null, undefined, String, String, /a/, /a/]对象不去重 NaN 会被忽略掉
Set[1, "1", null, undefined, String, String, /a/, /a/, NaN]对象不去重 NaN 去重
键值对方法[1, "1", null, undefined, String, /a/, NaN]全部去重