根据各位大佬的建议,再来三种原生去重方式
把数组中的重复项去除掉。比如:[1, 1, 1, 2, 2, 1, 2, 3, 3, 1, 3] => [1, 2, 3]
利用数组indexOf去重
indexOf 查找某一项在数组中首次出现的索引位置。返回-1说明数组中不存在这一项。
// 利用indexOf()
var arr = [1, 1, 1, 2, 2, 2, 1, 2]
// 准备一个新的空数组
var newArr = []
for (var i = 0; i < arr.length; i++) {
var cur = arr[i]
// 如果新数组里,还没有当前这一项 就将它添加到新数组里
if (newArr.indexOf(cur) === -1) {
newArr.push(cur)
}
}
console.log(newArr) // [1, 2]
函数封装
将上面代码封装到函数里,便于给其他数组去重复用
// 为了能够复用数组去重逻辑 封装到函数里
function unique(ary) {
var newArr = []
for (var i = 0; i < ary.length; i++) {
var cur = ary[i]
// 如果新数组里,还没有当前这一项 就将它添加到新数组里
if (newArr.indexOf(cur) === -1) {
newArr.push(cur)
}
}
return newArr
}
var arr1 = [1, 1, 1, 2, 2, 3, 3, 2]
console.log(unique(arr1)) // [1, 2, 3]
var arr2 = [3, 3, 5, 6, 5, 5, 6, 6]
console.log(unique(arr2)) // [3, 5, 6]
利用对象去重
把对象当做记账本来使用,只要往空数组添加过,就在对象中把当前值当做属性标记为true。
function unique(arr) {
// 准备一个空对象 相当于记账本
var obj = {}
// 准备一个空数组 存放不重复的值
var newArr = []
for (var i = 0; i < arr.length; i++) {
var cur = arr[i]
// 每次循环判断下 在对象中是否存在当前项这个属性,不存在 则执行if语句中的添加逻辑
if (!obj[cur]) { // 把当前值作为属性名来使用
// 将当前项添加到新数组
newArr.push(cur)
// 同时在对象里 把当前项作为属性,标记为true,表示已经往新数组添加过了
obj[cur] = true
}
}
console.log(obj) // {1: true, 2: true, 3: true}
console.log(newArr) // [1, 2, 3]
// 去重完 对象已经没用 释放内存
obj = null
return newArr
}
var arr1 = [1, 1, 1, 2, 2, 3, 3, 2]
console.log(unique(arr1)) // [1, 2, 3]
双循环去重
用当前项分别和后面每项进行比较,如果当前项和后面项 就将后面这一项删除掉(splice())
function unique(arr) {
// 外层循环每次负责取出一个当前项(比较项)
for (var i = 0; i < arr.length - 1; i++) {
var cur = arr[i]
// 内层循环 负责将当前项后面的每一项(被比较项)依次取出来 与 当前项进行比较
for (var j = i + 1; j < arr.length;) {
// 如果当前项与后一项相等,说明重复了,就将后一项用splice删除
// 用splice()删除中间某一项 会导致数组塌陷 删除项后面的每一项都会往前挪一位
// 如果从当前索引j处 删除了一项后面的就会塌陷过来,就先不让j++ 再次从这个索引位置比较一次
cur === arr[j] ? arr.splice(j, 1) : j++
}
}
return arr
}
var arr1 = [1, 1, 1, 2, 3, 3, 2, 2, 1, 2]
console.log(unique(arr1)) // [1, 2, 3]
----------------------------------------------------------------------------------------------------------------
参考文章&&强烈推荐:布罗利