浅谈JavaScript 数组操作---去重


数组去重也是老生常谈的事情了,作为前端开发人员,操作数组也是基本操作。尤其是后台管理类的项目。由后台返回json数据,前端通过接口请求到数据以后,对数据进行业务上的处理,进而渲染到页面上。

数组去重的核心思想

通过创建一个临时变量temp,用以存储不重复的元素。遍历待去重的数组,依次判断temp中是否存在此元素,不存在就将该元素放入temp。存在则跳过此元素。

数组去重的几种方法:

方案一:经典方法(indexOf)

function array_noRepeat(arr) {
  let len = arr.length
  if (!len) {
    return []
  }
  let tmp = []
  for (let i = 0; i < len; i++) {
    // 判断数组arr的元素是否在数组tmp中
    if (tmp.indexOf(arr[i]) === -1) {
      tmp.push(arr[i])
    }
  }
  return tmp
}
let arr = [1, 2, 3, '1', 2, undefined, undefined, 'undefined']
let newArr = array_noRepeat(arr)
console.log(newArr) // [1, 2, 3, '1', undefined, 'undefined']

此方法可以区分字符串和数字,区分 undefined 和 “undefined”,但是此种方法不能区分NaN。不考虑这些情况,还可以使用下面的方法(方法三):

方案二:适用于数组元素不存在特殊类型且类型单一的情况

function array_noRepeat(arr) {
  if (arr.length === 0) {
    return arr
  }
  let tmp = {}
  let len = arr.length
  for (let i = 0; i < len; i++) {
    if (tmp[arr[i]] === undefined) {
      tmp[arr[i]] = i
    }
  }
  return Object.keys(tmp)
}

// 调用数组去重
let arr = [1, 2, 3, 1, 2]
let newArr = array_noRepeat(arr)
console.log(newArr) // ['1', '2', '3']

方案三:利用ES6的includes 替代方案一中的indexOf方法。

includes 方法判断数组中是否包含某个元素,如包含返回true,反之返回false
function array_noRepeat(arr) {
  let len = arr.length
  if (!len) {
    return []
  }
  let tmp = []
  for (let i = 0; i < len; i++) {
    // 判断数组arr的元素是否在数组tmp中
    if (!tmp.includes(arr[i]) {
      tmp.push(arr[i])
    }
  }
  return tmp
}
let arr = [1, 2, 3, '1', 2, undefined, undefined,  'undefined', NaN, NaN]
let newArr = array_noRepeat(arr)
console.log(newArr) // [1, 2, 3, '1', undefined, 'undefined', NaN]

此方法对数组中包含数字、字符串、undefined、NaN都可以达到效果,如若你的数组中包含对象呢?那就需要用到下面的方法:

方案四:使用 findIndex

findIndex查询数组是否包含某个元素,如存在就返回元素的索引,如不存在返回-1。此方法可以传入回调函数callback,以约定方式进行查询。
function array_noRepeat(arr) {
  let len = arr.length
  if (!len) {
    return []
  }
  let tmp = []
  for (let i = 0; i < len; i++) {
    // 判断数组arr的元素是否在数组tmp中
    if (tmp.findIndex((v) => JSON.stringify(v) === JSON.stringify(arr[i])) === -1) {
      tmp.push(arr[i])
    }
  }
  return tmp
}
let arr = [1, 2, 3, '1', 2, undefined, undefined,  'undefined', NaN, NaN, {}, {}, {a: 1}, {a: 1}]
let newArr = array_noRepeat(arr)
console.log(newArr) // [1, 2, 3, '1', undefined, 'undefined', NaN, {}, {a: 1}]

方案五:使用 Set

Set 为ES6新增的数据结构,Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
let arr = [1, 2, 3, '1', 2, undefined, undefined, 'undefined']
let newArr = [...new Set(arr)]
console.log(newArr)  // [1, 2, 3, "1", undefined, "undefined"]

以上方法均可以用于数组的去重操作,具体选用那种还需以实际情况决定,如有更好的方法,欢迎评论补充。
Tips:
如果本文章对您有帮助,欢迎评论告知!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值