JS数组去重

本文详细介绍了多种JavaScript数组去重的方法,包括使用Set、Map、filter、for循环结合splice、includes、indexOf以及sort和递归等技术。每种方法都有其适用场景和局限性,如Set和Map能有效去重但不适用于对象类型;filter结合对象属性检查能处理更多类型,但需注意NaN的特殊性。
摘要由CSDN通过智能技术生成

JS数组去重

  1. 最简单的数组去重 由于Set中不会出现相同的值(空对象{}不能实现去重)
//写法1
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];
console.log([...new Set(arr)]);

//写法2
function unique (arr) {
  return Array.from(new Set(arr))
}
console.log(unique(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

  1. 创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值(空对象{}不能实现去重)
function unique2(arr) {
    let map = new Map();
    let array = new Array(); // 数组用于返回结果
    for (let i = 0; i < arr.length; i++) {
        // console.log(map);
        if (map.has(arr[i])) {       // 如果有该key值
            map.set(arr[i], "true"); //将值放到map的key
        } else {                     // 如果没有该key值
            map.set(arr[i], "true"); //将值放到map的key
            array.push(arr[i]);      //将值放到数组里
        }
    }
    
    return array;
}
var arr2 = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique2(arr2))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

  1. filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素(所有元素类型的都支持)
    用 typeof item + item 的唯一性,放到obj里,有就返回false,没有就typeof item + item放到obj里面,返回true
var arr1 = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];
function unique(arr) {
    var obj = {};
    return arr.filter((item, index, arr) => {
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}
console.log(unique(arr1));
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}]

  1. 利用在filter回调中元素的索引和在数组的索引值,否则返回当前元素(NaN全部都去掉了)
function unique(arr) {
  return arr.filter(function(item, index, arr) {
    return arr.indexOf(item, 0) === index;
  });
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]
  1. for for 然后splice去重,ES5常用NaN和{}没有去重,两个null直接消失了
  2. includes 判断是否存在那个元素,新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。 {}没有去重
  3. indexOf判断是否存在那个元素,新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。NaN和{}没有去重
  4. sort()排序+递归 遍历前一个是否相等,若相等则spliceNaN和{}没有去重
  5. sort()排序,遍历及相邻元素比对,若和前一个元素不相等,则这个元素push到新数组NaN和{}没有去重

参考该博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值