数组去重的尝试

2017-06-10  本文已影响0人  Corro

方法一:

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

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

上一篇 下一篇

猜你喜欢

热点阅读