数组去重的尝试


方法一:

定义一个结果数组rs,遍历原数组arr,并与结果数组比较:若在结果数组rs中不存在,则加入当前元素到结果数组,并继续遍历arr下一个元素;若存在,则直接遍历下一个元素。

遍历第一个元素1

第一个元素直接添加到结果数组,继续遍历第二个:

遍历第二个元素2

第二个元素2在rs中不存在,则加入rs数组,并继续遍历下一个:


遍历第三个元素1
遍历第四个元素2

第三个元素1在rs中存在,则直接遍历下一个,下一个2也存在于rs,则继续遍历,直到元素为3时,rs数组中不存在,则加入数组,然后继续:

遍历到元素3时

下面为实现的函数:

function unique(arr) {
  var rs = [arr[0]]
  for (var i = 0, arr_len = arr.length; i < arr_len; i++) {
    for (var j = 0, rs_len = rs.length; j < rs_len; j++) {
      if (arr[i] === rs[j]) { 
        j = 0
        i++
      }
    }
    if (arr[i]) rs.push(arr[i])
  }
  return rs
}
var arr = [1,2,1,3,4,5,3,6]
console.log(unique(arr))
结果:[1,2,3,4,5,6]

方法二:
先对数组进行排序,然后遍历判断相邻两个元素是否相等,若相等直接删除后一个元素,下一个元素继续与当前元素进行比较:

数组排序

遍历第一个元素1,与下一个元素比较,两个相等,则删除第二个元素:

遍历第一个元素1
删除第二个元素
删除后的数组

继续进行比较:

继续比较

两个元素不同,则保留第二个元素,然后主元素为第二个元素2,继续比较下一个:

比较元素2与元素3

两个元素不同,则保留,继续遍历与比较:

比较元素3与下一个元素3

两个相等,则删除后一个相等元素:

删除元素3

删除后的数组:

新数组

继续遍历:

继续比较

步骤方法以此类推。
实现函数:

function unique(arr) {
  arr.sort()
  for (var i = 0, len = arr.length; i < len; i++) {
    if (arr[i + 1] && arr[i] === arr[i + 1]) {
      arr.splice(i, 1)   // 删除当前
      i--   //  下个循环回退当前位
    }
  }
  return arr
}
var arr = [1, 2, 6, 1, 3, 3, 4, 5]
console.log(unique(arr))
结果:[1, 2, 3, 4, 5, 6]

方法三:
使用对象的key,value方式进行快速查询元素的存在,首定义一个空对象obj,遍历数组,使用元素作为key查询obj对象中是否存在,若不重复,将元素作为对象新属性的key并赋值为1,并将元素加入rs数组:

function unique(arr) {
  var obj = {},
       rs = []
  arr.forEach(function (item) {
    if (!obj[item]) { // 判断对象中是否存在以当前元素作为key的属性
      obj[item] = 1  // 添加以当前元素作为key的新属性到obj
      rs.push(item)   // 添加当前元素到结果数组
    }
  })
  return rs
}

方法四
ES6中添加了Set集合,Set集合中元素特点为唯一性,无重复,并且Array对象中新加了一个方法from(), 可以将类数组元素转化成数组,利用这两个API可以快速进行数组去重:

function unique(arr) {
  return Array.from(new Set(arr))
}
var arr = [1, 2, 6, 1, 3, 3, 4, 5]
console.log(unique(arr))
结果:[1, 2, 3, 4, 5, 6]

这是四个去重方法的实现,当然如果环境允许,优选第四种,次选第三种。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,318评论 18 399
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,627评论 0 4
  • 1 临近毕业,有很多人投入到了考研大军中。 一般考研的人大概也有几种类型: 第一种,确实很爱钻研学术,热衷做研究,...
    三十而丽阅读 3,401评论 5 7
  • 1. 保护隐私数据不被未授权访问; 什么是加密 1. 保护隐私数据不被未授权访问; 2. 用于隐藏真实数据,进行安...
    菩提大师阅读 4,383评论 1 1
  • 文/吉祥君 最近决定看《我是路人甲》,是因为偶然看了《我是路人甲》最后大蒿跳的那段音乐舞蹈,让我感受到了一种力量,...
    吉祥君阅读 3,882评论 0 3

友情链接更多精彩内容