数组去重的尝试


方法一:

定义一个结果数组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]

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容

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