方法一:
定义一个结果数组rs,遍历原数组arr,并与结果数组比较:若在结果数组rs中不存在,则加入当前元素到结果数组,并继续遍历arr下一个元素;若存在,则直接遍历下一个元素。
第一个元素直接添加到结果数组,继续遍历第二个:
第二个元素2在rs中不存在,则加入rs数组,并继续遍历下一个:
第三个元素1在rs中存在,则直接遍历下一个,下一个2也存在于rs,则继续遍历,直到元素为3时,rs数组中不存在,则加入数组,然后继续:
下面为实现的函数:
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,与下一个元素比较,两个相等,则删除第二个元素:
继续进行比较:
两个元素不同,则保留第二个元素,然后主元素为第二个元素2,继续比较下一个:
两个元素不同,则保留,继续遍历与比较:
两个相等,则删除后一个相等元素:
删除后的数组:
继续遍历:
步骤方法以此类推。
实现函数:
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]
这是四个去重方法的实现,当然如果环境允许,优选第四种,次选第三种。