数组去重的5种方法

数组去重的5种方法

第一种:遍历数组法

这种方法最简单最直观,也最容易理解,代码如下:

	let arr = [2, 8, 5, 0, 5, 2, 6, 7, 2, 6, 8, 9]
    let newArr = []
    for (let i = 0; i < arr.length; i++) {
        if (newArr.indexOf(arr[i]) === -1) {
            newArr.push(arr[i])
        }
    }
    console.log(newArr); // 输出结果为[2,8,5,0,6,7,9]

这种方法很好理解,利用了indexOf()方法(indexOf()方法如果查询到则返回查询到的第一个结果在数组中的索引,如果查询不到则返回-1)。先创建一个新的空数组用来存储新的去重的数组,然后遍历arr数组,在遍历过程中,分别判断newArr数组里面是不是有遍历到的arr中的元素,如果没有,直接添加进newArr中,如果已经有了(重复),那么不操作,那么从头到尾遍历一遍,正好达到了去重的目的

第二种:数组下标判断法

	let arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
    let newArr = []
    for (let  i = 0; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) === i) {
            newArr.push(arr[i])
        }
    }
    console.log(newArr) // 结果:[2, 8, 5, 0, 6, 7]

这和第一种方法有重叠,不说多余的,直接看if这里,在遍历arr的过程中,如果在arr数组里面找当前的值,返回的索引等于当前的循环里面的i的话,那么证明这个值是第一次出现,所以推入到新数组里面,如果后面又遍历到了一个出现过的值,那也不会返回它的索引,indexof()方法只返回找到的第一个值的索引,所以重复的都会被pass掉,只出现一次的值都被存入新数组中,也达到了去重的目的

第三种:排序后相邻去除法

	let arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
    arr.sort()
    let newArr = [arr[0]]
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] !== newArr[newArr.length - 1]) {
            newArr.push(arr[i])
        }
    }
    console.log(newArr) // 结果:[0, 2, 5, 6, 7, 8]

这种方法的思路是:先用sort()方法把arr排序,那么排完序后,相同的一定是挨在一起的,把它去掉就好了,首先给新数组初始化一个arr[0],因为我们要用它和arr数组进行比较,所以,for循环里面i也是从1开始了,我们让遍历到的arr中的值和新数组最后一位进行比较,如果相等,则pass掉,不相等的,push进来,因为数组重新排序了,重复的都挨在一起,那么这就保证了重复的这几个值只有第一个会被push进来,其余的都和新数组的被push进来的这个元素相等,会被pass掉,也达到了去重的效果。

第四种:优化的遍历数组法

 	let  arr = [2, 8, 5, 0, 5, 2, 6, 7, 2, 8]
    let  newArr = []
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] === arr[j]) {
                i++
                j = i
            }
        }
        newArr.push(arr[i])
    }
    console.log(newArr) // 结果:[0, 5, 6, 7, 2, 8]

两层for循环,外面一层是控制遍历到的前一个arr中的元素,里面一层控制的是第一层访问到的元素后面的元素,不断的从第0个开始,让第0个和他后面的元素比较,如果没有和这个元素相等的,则证明没有重复,推入到新数组中存储起来,如果有和这个元素相等的,则pass掉它,直接进入下一次循环。从第1个开始,继续和它后面的元素进行比较,同上进行,一直循环到最后就是:不重复的都被推入新数组里面了,而重复的前面的元素被pass掉了,只留下了最后面的一个元素,这个时候也就不重复了,则推入新数组,过滤掉了所有重复的元素,达到了去重的目的。

第五种:数组遍历法

	let arr = ['a', 'a', 'b', 'c', 'b', 'd', 'e', 'a']
    let newArr = []
    for (let i = 0; i < arr.length; i++) {
        let bl = true
        for (let j = 0; j < newArr.length; j++) {
            if (arr[i] === newArr[j]) {
                bl = false
                break
            }
        }
        if (bl) {
            newArr.push(arr[i])
        }
    }
    console.log(newArr) // 结果:["a", "b", "c", "d", "e"]

思路:也是两层for循环,外层for循环控制的是arr数组的遍历,内层for循环控制的是新数组的遍历,从第0位开始,如果新数组中没有这个arr数组中遍历到的这个元素,那么状态变量bl的值还是true,那么自然进入到了if中把这个值推入到新数组中,如果有这个元素,那么代表重复,则把状态变量bl取值改为false,并且跳出当前循环,不会进入到if内部,而进入下一次外层开始的循环。这样循环往复,最后也达到了去重的效果。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Sure! 下面是常见的6JavaScript数组去重方法: 1. 使用Set数据结构:Set是ES6引入的一新的数据结构,它可以自动去除重复的值。 ```javascript const array = [1, 2, 3, 3, 4, 5, 5]; const uniqueArray = [...new Set(array)]; console.log(uniqueArray); ``` 2. 使用filter方法:使用filter方法遍历数组,然后通过indexOf判断当前元素在数组中的索引和当前索引是否相等,如果相等则保留,否则去除。 ```javascript const array = [1, 2, 3, 3, 4, 5, 5]; const uniqueArray = array.filter((value, index, self) => { return self.indexOf(value) === index; }); console.log(uniqueArray); ``` 3. 使用reduce方法:使用reduce方法遍历数组,将每个元素放入一个新数组中,同时使用includes方法判断新数组中是否已存在该元素。 ```javascript const array = [1, 2, 3, 3, 4, 5, 5]; const uniqueArray = array.reduce((acc, currentValue) => { if (!acc.includes(currentValue)) { acc.push(currentValue); } return acc; }, []); console.log(uniqueArray); ``` 4. 使用Map数据结构:使用Map数据结构可以根据键的唯一性去除重复值。 ```javascript const array = [1, 2, 3, 3, 4, 5, 5]; const uniqueArray = Array.from(new Map(array.map(value => [value, value])).values()); console.log(uniqueArray); ``` 5. 使用递归:使用递归来遍历数组,然后判断当前元素是否在之前的元素中出现过。 ```javascript const array = [1, 2, 3, 3, 4, 5, 5]; function unique(array) { if (array.length === 1) { return array; } if (array.slice(1).includes(array

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值