数组去重总结+遇过的一些坑

很多方法说明会从菜鸟教程借鉴与粘贴,请读者不要介意,如果有好的其他方法欢迎读者们私信我补充。

1、for循环+splice方式

splice() 方法用于添加或删除数组中的元素。
注意:这种方法会改变原始数组。
splice方法的说明:
(1)基础语法:array.splice(index,howmany,item1,…,itemX)
(2)参数说明:

参数描述
index必需。规定从何处添加/删除元素。该参数是开始插入和(或)删除的数组元素的下标,必须是数字。
howmany可选。规定应该删除多少元素。必须是数字,但可以是 “0”。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
item1, …, itemX可选。要添加到数组的新元素。

若想查看详细例子可以移步菜鸟教程
以下是代码部分:

 let Arr = ["1", "2", "3", 1, "2", 'true', true, true, 5, 5, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN',{},{}]
    function unique() {
        for (var i = 0; i < Arr.length; i++) {
            for (var j = i + 1; j < Arr.length; j++) {
                if (Arr[i] == Arr[j]) { 
                    Arr.splice(j, 1);
                    j--;
                }
            }
        }
        console.log(Arr)
        return Arr;
    }

打印结果如下:

结果说明:看打印结果,我们能很明显的看到NaN和{}没有去重,两个null直接消失了,经测试发现(1)js中的NaN===NaN返回的是false,你可以这样理解: 因为NaN是Not a Number的缩写,即不是一个数字。如,A不是一个数字,B也不是一个数字,那你能说A与B完全相等吗?(2)undefined与null在判断时为true,所以都被删除掉了。(3){}与{},通过迭代器枚举对象的属性,你也能发现他们其实是不相等的,以上几种测试代码如下:
【1】关于undefined与null的测试

//关于undefined与null的测试
 let arrObj = [undefined,undefined,null,null];
    function unique() {
        for (let i = 0; i < arrObj.length; i++) {
            for (let j = i + 1; j < arrObj.length; j++) {
                if (arrObj[i] == arrObj[j]) { 
                    arrObj.splice(j, 1);
                    j--;
                }
            }
        }
        console.log(arrObj)
        return arrObj;
    }

结果打印:
图1
图2
图3
在这里插入图片描述
【2】关于{}的测试
说明:1、原始值的比较是值的比较:
    它们的值相等时它们就相等 ==
    它们的值和类型都相等时它们就恒等 ===。
   2、对象和原始值不同,对象的比较并非值的比较,而是引用的比较:
    即使两个对象包含同样的属性及相同的值,它们也是不相等的;
    即使两个数组各个索引元素完全相等,它们也是不相等的。
    简单来说:两个单独的对象永不相等, 两个单独的数组永不相等。
   3、我们通常将对象称为引用类型(reference type),以此来和JavaScript的基本类型区分开来。对象值都是引用(reference),对象的比较均是引用的比较:当且仅当它们引用同一个基对象时,它们才相等。

 let arrObj = [{},{}];
    let a = arrObj[0];
    let b = arrObj[0];
    function unique () {   
     console.log(arrObj[0]==arrObj[1]); //单独的永不相等
     console.log(a==b) //引用同一个,相等
    }

结果打印:
在这里插入图片描述

2、indexOf去重

定义和用法
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
如果没有找到匹配的字符串则返回 -1。
注意: indexOf() 方法区分大小写。
语法
string.indexOf(searchvalue,start)
参数值

参数描述
searchvalue必需。规定需检索的字符串值。
start可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 string Object.length - 1。如省略该参数,则将从字符串的首字符开始检索。

返回值

类型描述
Number查找指定字符串第一次出现的位置,如果没找到匹配的字符串则返回 -1。

若想查看详细例子可以移步菜鸟教程

let arr = ["1", "2", "3", 1, "2", 'true', true, true, 5, 5, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', {}, {}]
    function unique() {
        var array = [];
        for (let i = 0; i < arr.length; i++) {
            if (array.indexOf(arr[i]) === -1) {
                array.push(arr[i])
            }
        }
        console.log(array)
        return array;
    }

打印结果如下所示:
在这里插入图片描述

3、利用数组的sort方法进行去重

核心思想:现将数组排序,然后通过for循环将相邻元素进行对比,不等的时候放入新数组。

定义和用法
sort() 方法用于对数组的元素进行排序。
排序顺序可以是字母或数字,并按升序或降序。
默认排序顺序为按字母升序。

注意:当数字是按字母顺序排列时"40"将排在"5"前面。
使用数字排序,你必须通过一个函数作为参数来调用。
函数指定数字是按照升序还是降序排列。
这些说起来可能很难理解,你可以通过本页底部实例进一步了解它。
注意: 这种方法会改变原始数组!。

语法
array.sort(sortfunction);

参数 Values

参数描述
sortfunction可选。规定排序顺序。必须是函数。

返回值

Type描述
Array对数组的引用。请注意,数组在原数组上进行排序,不生成副本。

若想查看详细例子可以移步菜鸟教程

 let arr = ["1", "2", "3", 1, "2", 'true', true, true, 5, 5, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', {}, {}]
    function unique() {
        arr = arr.sort();
        let array = [arr[0]];
        for(let i=1;i<arr.length;i++) {
            if(arr[i]!==arr[i-1]) {
                array.push(arr[i])
            }
        }
        console.log("sort",array)
        return array;
    }

打印结果如下:
在这里插入图片描述

4、利用数组的includes() 方法去重

定义和用法
includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。

语法
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)

参数说明

参数描述
searchElement必须。需要查找的元素值。
fromIndex可选。从该索引处开始查找 searchElement。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
let arr = ["1", "2", "3", 1, "2", 'true', true, true, 5, 5, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', {}, {}]
    function unique() {
        var array = [];
        for (let i = 0; i < arr.length; i++) {
            if (!array.includes(arr[i])) {
                array.push(arr[i])
            }
        }
        console.log("includes",array)
        return array;
    }

打印结果如下所示
在这里插入图片描述
看结果我们能发现,使用includes方法是可以去除掉重复的NaN的。
若想查看详细例子可以移步菜鸟教程

5、使用数组的filter()方法去重

核心思想:看当前元素的索引值是否与在原数组中的索引值相同,相同则放到新数组中。

定义和用法
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。

语法
array.filter(function(currentValue,index,arr), thisValue)

参数描述
function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数 函数参数:
参数描述
currentValue必须。当前元素的值
index可选。当前元素的索引值
arr可选。当前元素属于的数组对象
thisValue可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。如果省略了 thisValue ,“this” 的值为 “undefined”
let arr = ["1", "2", "3", 1, "2", 'true', true, true, 5, 5, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', {}, {}]
function unique() {
   return arr.filter(function(currentValue,index,arr){
       return arr.indexOf(currentValue,0) === index;
   })
}

6、利用ES6中的set方法去重

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set 中的特殊值
【1】Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
【2】+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
【3】undefined 与 undefined 是恒等的,所以不重复;
【4】NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。

 let arr = ["1", "2", "3", 1, "2", 'true', true, true, 5, 5, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', {}, {}]
function unique() {
     var mySet = new Set(arr); // Array 转 Set
     [...mySet]; // 用...操作符,将 Set 转 Array
     console.log([...mySet])
 }

打印结果如下所示:
在这里插入图片描述
若想查看详细例子可以移步菜鸟教程

7、利用数组的reduce方法进行对象的去重

语法
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

参数

参数描述
function(total,currentValue, index,arr)必需。用于执行每个数组元素的函数。函数参数:
参数描述
total必需。初始值, 或者计算结束后的返回值。
currentValue必需。当前元素
currentIndex可选。当前元素的索引
currentIndex可选。当前元素所属的数组对象。
initialValue可选。传递给函数的初始值
// 数组对象去重
sliceArr(arr) {
     let obj = {};
     return (arr = arr.reduce((item, next) => {
         obj[next.k_s] ? '' : (obj[next.k_s] = true && item.push(next));
         return item;
     }, []));
 },

结果如下所示:
在这里插入图片描述
若想查看详细例子可以移步菜鸟教程

8、利用数组的some方法去重

注意:去不了Null和{}。
代码如下:

function unique(list) {
   let result = [list[0]];// 用于承接没有重复的数据,初始时将原始数组的第一个值赋给它。
   for (let i = 1; i < list.length; i++) {
     // 判断结果数组中是否存在一样的值,若果没有的话则将数据存入结果数组中。
     if (!(result.some(val => list[i] === val))) {
       result.push(list[i]);
     }
   }
   return result;
 }
let arr = ["1", "2", "3", 1, "2", 'true', true, true, 5, 5, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', {}, {}];
unique(arr); 

结果如下所示:
在这里插入图片描述
数组some方法的各个参数说明和具体用法

最后:特别感谢菜鸟教程官网提供的资料参考:菜鸟官网-js

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值