JS数组去重的12种方法

这篇具有很好参考价值的文章主要介绍了JS数组去重的12种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、利用ES6 Set去重(ES6中最常用)

Set对象是ES6中新定义的数据结构,类似数组,它允许存储任何类型的唯一值,不管是原始值还是对象引用。

Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组

function unqiue(arr) {
    return Array.from(new Set(arr))
}
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(unqiue(arr))
//1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}
  • 不考虑兼容性,这种去重的方式代码最少。这种方法无法去掉{}空对象,后面的高阶方法会添加去掉重复“{}”的方法。

二、[…new Set(arr)]

剩余参数语法允许将一个不定数量的参数表示为一个数组

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
var Arr = [...new Set(arr)]
console.log(Arr)
//1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}

三、利用for嵌套for,然后splice去重(ES5中最常用)

splice()方法可删除从第一个参数处开始的零个或多个元素,且用参数列表中声明的一个或多个值来替换那些被删除的元素

function unique(arr) {
    for (var i = 0; i < arr.length; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[i] == arr[j]) {  //第一个等同于第二个,splice方法删除第二个
                arr.splice(j, 1);
                j--
            }
        }
    }
    return arr
}
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", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]     //NaN和{}没有去重,两个null直接消失了

双层循环,外层循环元素,内层循环时比较值。值相同时,则删去这个值。


四、利用indexOf去重

indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var Arr = [];
    for (var i = 0; i < arr.length; i++) {
        if (Arr.indexOf(arr[i]) === -1) {
            Arr.push(arr[i])
        }
    }
    return Arr;
}
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, NaN, "NaN", 0, "a", {…}, {…}]  //NaN、{}没有去重

五、利用sort()

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return;
    }
    arr = arr.sort()
    var Arr = [arr[0]];
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] !== arr[i - 1]) {
            Arr.push(arr[i]);
        }
    }
    return Arr;
}
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))
// [0, 1, 15, "NaN", NaN, NaN, {…}, {…}, "a", false, null, true, "true", undefined]      //NaN、{}没有去重

六、利用对象的属性不能相同的特点去重(这种数组去重的方法有问题,不建议用,有待改进)

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var Arr = [];
    var obj = {};
    for (var i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) {
            Arr.push(arr[i])
            obj[arr[i]] = 1
            console.log(obj[arr[i]])
        } else {
            obj[arr[i]]++
            console.log(obj[arr[i]])
        }
    }
    return Arr;
}
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", 15, false, undefined, null, NaN, 0, "a", {…}] //两个true直接去掉了,NaN和{}去重

七、利用includes

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

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var Arr = [];
    for (var i = 0; i < arr.length; i++) {
        if (!Arr.includes(arr[i])) {//includes 检测数组是否有某个值
            Arr.push(arr[i]);
        }
    }
    return Arr
}
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, "NaN", 0, "a", {…}, {…}] //{}没有去重

八、利用hasOwnProperty 判断是否存在对象属性

Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。filter()方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素

function unique(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr){
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}
    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, "NaN", 0, "a", {…}] //所有的都去重了

九、利用filter

indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置

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", {…}, {…}]

十、利用递归去重

splice()方法可删除从第一个参数处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素

function unique(arr) {
    var array = arr;
    var len = array.length;

    array.sort(function (a, b) {   //排序后更加方便去重
        return a - b;
    })

    function loop(index) {
        if (index >= 1) {
            if (array[index] === array[index - 1]) {
                array.splice(index, 1);
            }
            loop(index - 1);    //递归loop,然后数组去重
        }
    }
    loop(len - 1);
    return array;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaNaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
//[1, "true", false, null, 0, true, 15, NaN, NaN, "NaN", "a", {…}, {…}, undefined]

十一、利用Map数据结构去重

map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

function unique(arr) {
    let map = new Map();
    let array = new Array();  // 数组用于返回结果
    for (let i = 0; i < arr.length; i++) {
        if (map.has(arr[i])) {  // 如果有该key值
            map.set(arr[i], true);
        } else {
            map.set(arr[i], false);   // 如果没有该key值
            array.push(arr[i]);
        }
    }
    return array;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaNNaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。


十二、利用reduce+includes

reduce()方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。includes()方法用来判断一个数组是否包含一个指定的值,如果是返回true,否则false。文章来源地址https://www.toymoban.com/news/detail-741343.html

function unique(arr) {
    return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaNNaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr));
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

到了这里,关于JS数组去重的12种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【面试题】如何实现数组去重的?有几种方式?

     前端面试题库 ( 面试必备)              推荐:★★★★★ 地址:前端面试题库 【国庆头像】- 国庆爱国 程序员头像!总有一款适合你! 通过两层循环对数组元素进行逐一比较,然后通过splice方法来删除重复的元素。此 方法对NaN是无法进行去重的 ,因为进行比较时

    2024年02月10日
    浏览(39)
  • Js:获取数组对象重复属性值和数组对象去重

    对象数组去重分为两类:根据某一属性去重,和去重完全相同对象(属性属性值都相同) 一.数组嵌套对象,根据对象某一属性去重 二、数组嵌套对象,去重完全相同对象(属性属性值都相同) 整理如下: 首先、循环数组,拿到对象的所有属性组成的数组; 其次、循环属性

    2024年01月21日
    浏览(53)
  • JS操作数组神器——reduce(求和、出现次数、去重、分类)

    reduce() 对数组每个元素执行一次由您提供的reduce函数(升序执行),将其结果汇总为单个返回值。 循环遍历能做的,reduce都可以做。比如数组根据元素某个属性求和、数组元素出现次数、数组去重、数组根据某个元素属性分类等等。 参数介绍 prev 必需。累计器累计回调的返回值

    2023年04月26日
    浏览(36)
  • 〖大前端 - 基础入门三大核心之JS篇㉔〗- JavaScript 的数组的常用方法 (一)

    当前子专栏 基础入门三大核心篇 是免费开放阶段 。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 大前端全栈架构白宝书专栏, 目前阶段免费开放 , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:除了通过订阅\\\"白宝书系列专

    2024年02月07日
    浏览(56)
  • JavaScript数组去重,大小排序的两种方法

    方法有很多种,本文列举其中两种 声明一个数组 数组去重 1:利用ES6中的 Set 方法去重(最常用) 原理: Set数据结构中所有元素都是唯一的,没有重复 Set 本身是一个构造函数,用来生成 Set 数据结构 2:利用indexOf去重 原理: indexof() 可返回某个指定的字符串值在字符串中首

    2024年02月06日
    浏览(44)
  • js两个数组对象去重,删除两个数组中相同的对象、删除数组对象中某个对象

    模拟一些数据: 方式一:两个数组通过arr1的id和arr2的id比较,返回去重后的arr1  写法二 打印的结果:console.log(newArr); 方式二:删除两个数组对象中相同的对象 方式三:es6 去掉两个数组中相同值的对象 删除数组中某一个对象、指定的对象 数组删除其中的对象或元素,在前端

    2023年04月09日
    浏览(45)
  • Stream流实践(二):list 对象数组根据某字段去重的三种基本思路

    相信大家对于list简单数组的去重很熟悉了,例如以下代码 那我们来探讨下,对于list中保存为对象的数组,根据内部对象的 某一个字段 去重有什么好的思路呢? 给出一个简单的Student对象 大家学废了吗?

    2024年02月16日
    浏览(85)
  • 【linux】linux去重的方法

    多种linux文本去重方法 awk去重法【1】 awk去重法【2】 awk去重法【3】 sort去重法【1】 sort去重法【2】 (用于多个文件一次性去重) sort去重法【3】 (查找非重复行) sort去重法【4】 (统计字符出现次数) grep去重法【1】 grep去重法【2】

    2024年02月11日
    浏览(44)
  • List去重的几种方法

    现在设有Integer类型的ArrayList,list=[0,1,1,3,3,4,5] 1.使用contains 2.使用TreeSet/HashSet/LinkedHashSet 3.Stream流 4.使用迭代器Iterator 5.list中的remove方法

    2024年02月05日
    浏览(60)
  • List 去重的 6 种方法,这个方法最完美!

    在日常的业务开发中,偶尔会遇到需要将 List 集合中的重复数据去除掉的场景。这个时候可能有同学会问:为什么不直接使用 Set 或者 LinkedHashSet 呢?这样不就没有重复数据的问题了嘛? ​ 不得不说,能提这个问题的同学很机智,一眼就看到了问题的本质。 ​ 但是,在实际

    2024年02月03日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包