数组去重(javascript篇)

javascript系列之 数组去重 篇

本篇将介绍4种数组去重的方法,其他的基本都大同小异

1.利用Set、Map数据结构

利用Set、Map数据结构成员的值都是唯一的特点

//Set
function dedupe (arr) {
  return [...new Set(arr)];
}

function dedupe (arr) {
  return Array.from(new Set(arr));
}

//Map
function deeupe (arr) {
  let map = new Map();
  return arr.filter(function (ele) {
    return !map.has(ele) && map.set(ele, 123)
    //当map结构没有ele时,添加并返回true
  })
}

2.利用arr.indexOf()

function dedupe (arr) {
  let rslt = [];
  arr.forEach(ele => {
    if(rslt.indexOf(ele) == -1) {
      rslt.push(ele)//没有则添加
    }
  });
  return rslt;
}

function dedupe (arr) {
  return arr.filter(function (ele, index) {
    return arr.indexOf(ele) === index
    //当arr中有重复的ele时,indexOf()总是返回第一个匹配到的index索引
    //第一个ele的indexOf的索引等于遍历循环中的index
    //而重复的值的indexOf的返回的索引值(为第一个ele索引值)总是小于本身的index
  })
}

3.利用arr.sort()排序去重

arr.sort()排序后的数组相同的都会排在一起,这是可以跟前一个作比较是否一样来确认是否重复

function dedupe10 (arr) {
    let rslt = [];
    let previous;
    let sortedArr = arr.slice().sort();
    //先复制再排序,避免修改到原arr
    sortedArr.forEach(function (ele) {
      if(!rslt.length || ele !== previous) {
      //如果是第一个元素或者相邻的元素不相同
      //注意要用!==全等比较
        rslt.push(ele)
        previous = ele;
      }
    })
    return rslt;
  }

4.利用object的键值

object的键值不会重复,可以实现数组去重

//不能识别数字和字符串,如arr=[1, '1'],返回[1];
//对象无法识别,对象会被转为[object Object]
function dedupe(arr) {
  let obj = {};
  return arr.filter(function (ele) {
    if(!obj.hasOwnProperty(ele)) {
      obj[ele] = 123
      return true;
    }
    return false
    //可简化为return !obj.hasOwnProperty(ele) && (obj[ele] = 123)
  })
}

//利用[typeof(ele)+ele]可识别数字和字符串
function dedupe8(arr) {
  let obj = {};
  return arr.filter(function (ele) {
    return !obj.hasOwnProperty(typeof(ele) + ele) && (obj[typeof(ele) + ele] = 123)
  })
}

//利用[typeof(ele)+JSON.stringify(ele)]可识别对象(内容不同)
function dedupe(arr) {
  let obj = {};
  return arr.filter(function (ele) {
    log(typeof(ele) + JSON.stringify(ele));
    return !obj.hasOwnProperty(typeof(ele) + JSON.stringify(ele)) && (obj[typeof(ele) + JSON.stringify(ele)] = 123)
  })
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值