let arr = [1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0, 0,'a','a',{},{}];
console.log('arr', arr); // (23)
1、利用hasOwnProperty
- hasOwnProperty 判断是否存在对象属性
- filter用于对数组进行过滤,它创建一个新数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
function uniqueHasOwnProperty(arr) {
let obj = {};
return arr.filter(item => {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true);
});
}
console.log('hasOwnProperty', uniqueHasOwnProperty(arr)); // (12) [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}]
// 注:全部去重
2、利用filter
- 当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
- indexOf()可返回某个指定的字符串值在字符串中首次出现的位置
function uniqueFilter(arr) {
return arr.filter((item, index) => {
return arr.indexOf(item) === index;
})
}
console.log('filter', uniqueFilter(arr)); // (12) [1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {}, {}]
// 注:全部去重
3、利用reduce+includes
- reduce函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值
function uniqueReduce(arr) {
return arr.reduce((prev, cur) => {
return prev.includes(cur) ? prev : [...prev, cur]
} ,[]);
}
console.log('reduce', uniqueReduce(arr)); // (13) [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
// 注:{}没有去重
4、利用ES6 Set
- Set结构类似于数组,但是成员的值都是唯一的,没有重复的值
- Array.from()可将Set结构转为数组
function uniqueSet(arr) {
return Array.from(new Set(arr));
}
console.log('ES6', uniqueSet(arr)); // (13) [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
// 注:{}没有去重
5、利用[…new Set(arr)]
function uniqueOperator(arr) {
return [...new Set(arr)];
}
console.log('operator', uniqueOperator(arr)); // (13) [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
// 注:{}没有去重
6、利用ES6 Map
- 创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中;由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果
function uniqueMap(arr) {
let map = new Map();
let result = new Array();
for(let i = 0; i < arr.length; i++) {
if(map.has(arr[i])) {
map.set(arr[i], true);
} else {
map.set(arr[i], false);
result.push(arr[i]);
}
}
return result;
}
console.log('map', uniqueMap(arr)); // (13) [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
// 注:{}没有去重
7、利用includes
- includes 检测数组中是否有某个值
function uniqueIncludes(arr) {
if(!Array.isArray(arr)) return;
let result = [];
for(let i = 0; i < arr.length; i++) {
if(!result.includes(arr[i])) {
result.push(arr[i]);
}
}
return result;
}
console.log('includes', uniqueIncludes(arr)); // (13) [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
// 注:{}没有去重
8、利用indexOf
- 新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组
function uniqueIndexOf(arr) {
if(!Array.isArray(arr)) return;
let result = [];
for(let i = 0; i < arr.length; i++) {
if(result.indexOf(arr[i]) === -1) {
result.push(arr[i]);
}
}
return result;
}
console.log('indexOf', uniqueIndexOf(arr)); // (14) [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {}, {}]
// 注:NaN、{}没有去重
9、利用sort()
- 利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对
function uniqueSort(arr) {
if(!Array.isArray(arr)) return;
arr = arr.sort();
let result = [arr[0]];
for(let i = 1; i < arr.length; i++) {
if(arr[i] !== arr[i-1]) {
result.push(arr[i]);
}
}
return result;
}
console.log('sort', uniqueSort(arr)); // (14) [0, 1, 15, NaN, NaN, "NaN", {}, {}, "a", false, null, "true", true, undefined]
// 注:NaN、{}没有去重
10、利用递归
function uniqueRecursion(arr) {
let result = arr;
let len = result.length;
result.sort(function(a,b) { //排序后更加方便去重
return a - b;
})
function loop(index) {
if(index >= 1) {
if(result[index] === result[index - 1]) {
result.splice(index,1);
}
loop(index - 1);
}
}
loop(len - 1);
return result;
}
console.log('recursion', uniqueRecursion(arr)); // (14) [1, "true", false, null, 0, true, 15, NaN, NaN, "NaN", "a", {}, {}, undefined]
// 注:NaN、{}没有去重
11、利用for嵌套for,然后splice去重
- 双层循环,外层循环元素,内层循环时比较值,利用splice去重(值相同时,则删去该值)
function uniqueFor(arr) {
for(let i = 0; i < arr.length; i++) {
for(let j = i + 1; j < arr.length; j++) {
if(arr[i] == arr[j]) {
arr.splice(j,1);
j--;
}
}
}
return arr;
}
console.log('for', uniqueFor(arr)); // (11) [1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {}, {}]
// 注:NaN、{}没有去重,两个null消失了