js数组去重-四大方法

法一:es6方法

1.Set+展开运算符
let arr = [ 1,2,3,4,2,3 ]

let ary = [ ...new Set(arr) ]
2.Array.form+Set
let arr = [ 1,2,3,4,2,3 ]

let ary = [ Arrat.form(new Set(arr)) ]

法二:当前项和后面每一项比较

1.indexOf 配合splice

let arr = [1, 2, 3, 4, 2, 3]
for (let i = 0; i < arr.length; i++) {
    let item = arr[i]
    console.log(item); //123423
    let args = arr.slice(i + 1) // 去掉当前要比较的项,方便下一步indexOf进行判断
    if (args.indexOf(item) > -1) {
        // indexOf 如果未找到和当前项一样的,会返回-1
        //现在的条件是>-1  说明后面有重复的
        arr.splice(i, 1) //从当前项截取,一个数字。但是循环会i++ ,会造成数组塌陷
        i-- //防止数组塌陷
    }
}
console.log(arr);

2.indexOf 和替换思维(和第一步基本相同,就是将splice方法换成替换)

let arr = [1, 2, 3, 4, 2, 3]
for (let i = 0; i < arr.length; i++) {
    let item = arr[i]
    console.log(item); //123423
    let args = arr.slice(i + 1)
    if (args.indexOf(item) > -1) {
        // indexOf 如果未找到和当前项一样的,会返回-1
        //现在的条件是>-1  说明后面有重复的
        arr[i] = arr[arr.length - 1] //把当前重复的项。 用最后一项,替换当前重复的项
        arr.length-- //替换相当于去掉,所以数组长度减一
            i-- // 数组塌陷,提前--

    }
}
console.log(arr);

3.indexOf +赋值+过滤

let arr = [1, 2, 3, 4, 2, 3]
for (let i = 0; i < arr.length; i++) {
    let item = arr[i]
    console.log(item); //123423
    let args = arr.slice(i + 1)
    if (args.indexOf(item) > -1) {
        // indexOf 如果未找到和当前项一样的,会返回-1
        //现在的条件是>-1  说明后面有重复的
        arr[i] = null //把当前重复的全部赋值为null
    }
}
// 在输出结果之前,将数组中为null的项,全部过滤
arr = arr.filter(item => item !== null)
console.log(arr);

在这里插入图片描述
在这里插入图片描述

法三:用新东西存储,再验证有没有存过

1.创建新数组+indexOf+push

let arr = [1, 2, 3, 4, 2, 3]
let newArr = []  //创建新的空数组
for (let i = 0; i < arr.length; i++) {
    let item = arr[i]
    let args = arr.slice(i + 1)
    if (args.indexOf(item) > -1) {
        // indexOf 如果未找到和当前项一样的,会返回-1
        //现在的条件是>-1  说明这里有重复的

    } else {
        // 那else里面存放的就是数组没有重复的项,将没有重复的项,push到新数组里面
        newArr.push(item)

    }
}
console.log(newArr);

法四:先排序,再相邻比较(基于正则)

正则+slice

let arr = [1, 2, 3, 4, 2, 3]
arr = arr.sort((a, b) => a - b) //升序排列
arr = arr.join('#') + '#'
let reg = /(\d+#)\1*/g //  出现一个根第一个一模一样的分组 
ary = []
arr.replace(reg, (n, m) => { //大正则捕获 n 是所有的单个重复   m 是单个的
    console.log(n, m);
    ary.push(Number(m.slice(0, m.length - 1)))
})
console.log(ary);

在这里插入图片描述
具体介绍
+. slice: 从已有数组返回指定元素
+. splice(会引起数组塌陷)
方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。
+. indexOf 如果未找到和当前项一样的,会返回-1
+. 数组塌陷:改变原数组,数组的所有索引发生改变,如果再进行++操作,会把第一个元素漏掉,所以++之前,先进行-- ,
+.
优缺点: – 进行计算,会降低性能;用新东西进行存储,会开辟内存空间;最优方案:正则

发布了142 篇原创文章 · 获赞 77 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_38845858/article/details/103886608