数组去重的方法
一、双重for
定义一个新数组,并存放原数组的第0个元素,然后将元素组一一和新数组的元素对比,若不同则存放在新数组中。这里面用到了标志位的思想,先假设不重复var isRepeat = false,如果遇到重复的,就修改为isRepeat = true并且结束循环,循环结束后再判断isRepeat的状态从而决定是否放入新数组。
1 function unique (arr) { 2 var newArr = [arr[0]] 3 for (var i = 1; i < arr.length; i++) { 4 var isRepeat = false 5 for (var j = 0; j < newArr.length; j++) { 6 if (arr[i] === newArr[j]) { 7 isRepeat = true 8 break 9 } 10 } 11 if (!isRepeat) { 12 newArr.push(arr[i]) 13 } 14 } 15 return newArr 16 } 17 console.log(unique([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
二、排序 + 去重
先将原数组排序(无论按数字大小排序还是ASCII码排序均可),再与相邻的进行比较,如果不同则存入新数组。
1 function unique2 (arr) { 2 var sortArr = arr.sort() 3 var newArr = [sortArr[0]] 4 for (let i = 1; i < sortArr.length; i++) { 5 if (sortArr[i] !== sortArr[i-1]) { 6 newArr.push(sortArr[i]) 7 } 8 } 9 return newArr 10 } 11 console.log(unique2([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 12, 2, 3, 7]
三、利用对象
利用对象属性名不重复的特性,将数组元素作为对象属性名来取值,如果没有取到值则代表此元素是第一次被遍历到也就是第一次出现,那就把他作为对象属性名存一个值并push进新数组,下次如果再遍历到相同的元素则if不成立,不再push。
1 function unique3 (arr) { 2 var obj = {} 3 var newArr = [] 4 for (let i = 0; i < arr.length; i++) { 5 if (!obj[arr[i]]) { 6 obj[arr[i]] = 1 7 newArr.push(arr[i]) 8 } 9 } 10 return newArr 11 } 12 console.log(unique3([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
四、indexOf
利用数组的indexOf下标属性来查询。
1 function unique4 (arr) { 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 return newArr 9 } 10 console.log(unique4([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
五、lastIndexOf
和方法四几乎一致:
1 function unique5 (arr) { 2 var newArr = [] 3 for (var i = 0; i < arr.length; i++) { 4 if (newArr.lastIndexOf(arr[i]) === -1) { 5 newArr.push(arr[i]) 6 } 7 } 8 return newArr 9 } 10 console.log(unique5([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
六、includes
利用数组原型对象上的includes方法。
1 function unique6 (arr) { 2 var newArr = [] 3 for (var i = 0; i < arr.length; i++) { 4 if (!newArr.includes(arr[i])) { 5 newArr.push(arr[i]) 6 } 7 } 8 return newArr 9 } 10 console.log(unique6([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
七、filter + includes
利用数组原型对象上的 filter 和includes方法,如果newArr已存在该元素,filter里就return false,否则就push并返回一个true(我这里返回的是push的返回值即数组新的length)。
function unique7 (arr) { var newArr = [] newArr = arr.filter(function (item) { return newArr.includes(item) ? false : newArr.push(item) }) return newArr } console.log(unique7([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
八、forEach + includes
利用数组原型对象上的 forEach 和 includes方法,和方法七几乎相同。
1 function unique8 (arr) { 2 var newArr = [] 3 arr.forEach(item => { 4 return newArr.includes(item) ? '' : newArr.push(item) 5 }) 6 return newArr 7 } 8 console.log(unique8([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
九、splice
利用数组原型对象上的 splice 方法。当查找到相同元素使用splice删除,删除之后需要j--,否则会跳过一次比较。
1 function unique9 (arr) { 2 for (var i = 0; i < arr.length; i++) { 3 for (var j = i + 1; j < arr.length; j++) { 4 if (arr[i] === arr[j]) { 5 arr.splice(j, 1) 6 j-- 7 } 8 } 9 } 10 return arr 11 } 12 console.log(unique9([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
十、Set
Set数据结构是ES6新增的一种数据结构,它类似于数组,其成员的值都是唯一的,本身就不允许重复。我们可以把数组转换为Set类型再重新转回为数组即可完成去重。
1 function unique10 (arr) { 2 return Array.from(new Set(arr)) 3 } 4 console.log(unique10([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
也可以这么写:
1 function unique10 (arr) { 2 return [...new Set(arr))] 3 } 4 console.log(unique10([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]
十一、reduce
1 function unique11 (arr) { 2 return arr.reduce((newArr, current) => { 3 return newArr.includes(current) ? newArr : newArr.concat(current) 4 }, []) 5 } 6 console.log(unique11([1, 2, 2, 2, 3, 1, 12, 7, 12])) // [1, 2, 3, 12, 7]

浙公网安备 33010602011771号