JS 数组去重总结

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消失了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值