var arr = [1, 3, 5, 2, 2, 5, 6, 7, 8, 3, 4, 5, 6, 8, 9, 6]
1. 利用两个数组,遍历源数组和目标数组中,目标数组中存在这个元素,则不添加, 不存在则添加
function uniqueArr(array) {
var _arr = [],
isRepeat;
for(var i = 0; i < array.length; i++) {
isRepeat = false;
for(var j = 0; j < _arr.length; j++) {
if(_arr[j] == array[i]) {
isRepeat = true;
break;
}
}
if(!isRepeat) {
_arr.push(array[i])
}
}
return _arr;
}
2. 双重遍历原数组,第一层遍历所有的,第二层从i+1开始遍历, 第二层的数组不存在与第i位重复的,则将这个元素存到目标数组中 function uniqueArr(array) {
var _arr = [],
isRepeat;
for(var i = 0; i < array.length; i++) {
isRepeat = false;
for(var j = i + 1; j < array.length; j++) {
if(array[j] == array[i]) {
isRepeat = true;
break;
}
}
if(!isRepeat) {
_arr.push(array[i])
}
}
return _arr;
}
3. 利用数组的filter方法和indexOf方法,这个方法非常巧妙,indexOf会返回这个元素第一次出现的下标,如果这个下标刚好为filter遍历的index, 则说明这个元素第一次出现,可以返回 function uniqueArr(array) {
return array.filter((item, index) => array.indexOf(item) === index)
}
function uniqueArr(array) {
var _arr = [];
array.forEach(item => {
if(_arr.indexOf(item) < 0) {
_arr.push(item)
}
});
return _arr;
}
4. 利用sort和遍历,先将数组排序,排序后的数组,相同的元素会排在一起,我们只要找出相邻的元素为不同的元素,将左边的元素push到目标数组中则可以。
function uniqueArr(array) {
var _arr = [];
array.sort();
for(var i = 0; i < array.length; i++) {
if(array[i] !==array[i+1]) {
_arr.push(array[i])
}
}
return _arr;
}
5. 利用sort和遍历,先将数组排序,排序后的数组,相同的元素会排在一起, 我们遍历原数组中,找出和目标数组中最后一位不同的元素就可以了
function uniqueArr(array) {
var _arr = [];
array.sort();
for(var i = 0; i < array.length; i++) {
if(array[i] !== _arr[_arr.length - 1]) {
_arr.push(array[i])
}
}
return _arr;
}
// es6
indexOf和includes区别:6. 利用es6的includes方法, 遍历原数组,将不存在于目标数组中的元素push进目标数组中就可以
indexOf: 返回元素位置,对NaN无效, eg: arr = [1, NaN, 2], arr.indexOf(NaN) // -1
includes:返回true和false
function uniqueArr(array) {
var _arr = [];
array.forEach(item => {
if(!_arr.includes(item)) {
_arr.push(item)
}
})
return _arr;
}
7. 先用sort排序,通过数组的reduce方法归纳数组,将prev数组的最后一位与原数组比较, 不同就可以留下,这个方法与方法5类似 function uniqueArray(array) { array.sort() return array.reduce((prev, item, index) => { if (prev[prev.length - 1] !== item) { prev.push(item); } return prev; }, []) }
8. 利用map的string key的唯一性,将数组元素作为map的key去重 function uniqueArray(array) { var _arr = [], map = new Map(); for (var i = 0; i < array.length; i++) { if (!map.get(array[i])) { map.set(array[i], 1) _arr.push(array[i]) } } return _arr }
9. 利用object的string key的唯一性,将数组元素作为map的key去重 function uniqueArray(array) { var _arr = [], obj = {}; for (var i = 0; i < array.length; i++) { if (!obj[array[i]]) { obj[array[i]] = 1; _arr.push(array[i]) } } return _arr } 10. 利用set的元素唯一性,set中没有重复的元素 function uniqueArray(array) { return Array.from(new Set(array)) } console.log(uniqueArray(arr))