今天来聊一聊JS数组去重的一些方法,包括一些网上看到的和本身总结的,总共5种方法(ES5)。数组
这种方法最简单最直观,也最容易理解,代码以下:优化
1 var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2] 2 var newArr = [] 3 for (var i = 0; i < arr.length; i++) { 4 if (newArr.indexOf(arr[i]) === -1) { 5 newArr.push(arr[i]) 6 } 7 } 8 console.log(newArr) // 结果:[2, 8, 5, 0, 6, 7]
这种方法很好理解,利用了indexOf()
方法(indexOf()
方法若是查询到则返回查询到的第一个结果在数组中的索引,若是查询不到则返回-1)。先建立一个新的空数组用来存储新的去重的数组,而后遍历arr
数组,在遍历过程当中,分别判断newArr
数组里面是否是有遍历到的arr
中的元素,若是没有,直接添加进newArr
中,若是已经有了(重复),那么不操做,那么从头至尾遍历一遍,正好达到了去重的目的。spa
这种方法也比较好理解,代码以下:code
1 var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2] 2 var newArr = [] 3 for (var i = 0; i < arr.length; i++) { 4 if (arr.indexOf(arr[i]) === i) { 5 newArr.push(arr[i]) 6 } 7 } 8 console.log(newArr) // 结果:[2, 8, 5, 0, 6, 7]
这和第一种方法有重叠,不说多余的,直接看if
这里,在遍历arr
的过程当中,若是在arr
数组里面找当前的值,返回的索引等于当前的循环里面的i的话,那么证实这个值是第一次出现,因此推入到新数组里面,若是后面又遍历到了一个出现过的值,那也不会返回它的索引,indexof()
方法只返回找到的第一个值的索引,因此重复的都会被pass掉,只出现一次的值都被存入新数组中,也达到了去重的目的。blog
这种方法用到了sort()
方法,代码以下:排序
1 var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2] 2 arr.sort() 3 var newArr = [arr[0]] 4 for (var i = 1; i < arr.length; i++) { 5 if (arr[i] !== newArr[newArr.length - 1]) { 6 newArr.push(arr[i]) 7 } 8 } 9 console.log(newArr) // 结果:[0, 2, 5, 6, 7, 8]
这种方法的思路是:先用sort()
方法把arr
排序,那么排完序后,相同的必定是挨在一块儿的,把它去掉就行了,首先给新数组初始化一个arr[0]
,由于咱们要用它和arr
数组进行比较,因此,for
循环里面i
也是从1开始了,咱们让遍历到的arr
中的值和新数组最后一位进行比较,若是相等,则pass掉,不相等的,push进来,由于数组从新排序了,重复的都挨在一块儿,那么这就保证了重复的这几个值只有第一个会被push进来,其他的都和新数组的被push进来的这个元素相等,会被pass掉,也达到了去重的效果。索引
1 var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2, 8] 2 var newArr = [] 3 for (var i = 0; i < arr.length; i++) { 4 for (var j = i + 1; j < arr.length; j++) { 5 if (arr[i] === arr[j]) { 6 i++ 7 j = i 8 } 9 } 10 newArr.push(arr[i]) 11 } 12 console.log(newArr) // 结果:[0, 5, 6, 7, 2, 8]
思路:两层for循环,外面一层是控制遍历到的前一个arr
中的元素,里面一层控制的是第一层访问到的元素后面的元素,不断的从第0个开始,让第0个和他后面的元素比较,若是没有和这个元素相等的,则证实没有重复,推入到新数组中存储起来,若是有和这个元素相等的,则pass掉它,直接进入下一次循环。从第1个开始,继续和它后面的元素进行比较,同上进行,一直循环到最后就是:不重复的都被推入新数组里面了,而重复的前面的元素被pass掉了,只留下了最后面的一个元素,这个时候也就不重复了,则推入新数组,过滤掉了全部重复的元素,达到了去重的目的。console
1 var arr = ['a', 'a', 'b', 'c', 'b', 'd', 'e', 'a'] 2 var newArr = [] 3 for (var i = 0; i < arr.length; i++) { 4 var bl = true 5 for (var j = 0; j < newArr.length; j++) { 6 if (arr[i] === newArr[j]) { 7 bl = false 8 break 9 } 10 } 11 if (bl) { 12 newArr.push(arr[i]) 13 } 14 } 15 console.log(newArr) // 结果:["a", "b", "c", "d", "e"]
arr
数组的遍历,内层for循环控制的是新数组的遍历,从第0位开始,若是新数组中没有这个
arr
数组中遍历到的这个元素,那么状态变量
bl
的值仍是
true
,那么天然进入到了if中把这个值推入到新数组中,若是有这个元素,那么表明重复,则把状态变量
bl
取值改成
false
,而且跳出当前循环,不会进入到if内部,而进入下一次外层开始的循环。这样循环往复,最后也达到了去重的效果。