js数组去重方法的总结

js数组去重的方法:1、利用ES6 Set去重;2、利用for嵌套for,然后splice去重;3、利用indexOf去重;4、利用sort()去重;5、利用对象的属性不能相同的特点进行去重等等。

js数组去重方法的总结

推荐:《js视频教程》

数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看。
在真实的项目中碰到的数组去重,一般都是后台去处理,很少让前端处理数组去重。虽然日常项目用到的概率比较低,但还是需要了解一下,以防面试的时候可能回被问到。

注:写的匆忙,加上这几天有点忙,还没有非常认真核对过,不过思路是没有问题,可能一些小细节出错而已。

数组去重的方法

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

function unique (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(unique(arr)) //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]

登录后复制

不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象,后面的高阶方法会添加去掉重复“{}”的方法。

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

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直接消失了

登录后复制

双层循环,外层循环元素,内层循环时比较值。值相同时,则删去这个值。
想快速学习更多常用的ES6语法,可以看我之前的文章《学习ES6笔记──工作中常用到的ES6语法》。

三、利用indexOf去重

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

登录后复制

新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。

四、利用sort()

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

登录后复制

利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对。

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

function unique(arr) {    if (!Array.isArray(arr)) {        console.log('type error!')        return    }    var arrry= [];     var  obj = {};    for (var i = 0; i < arr.length; i++) {        if (!obj[arr[i]]) {            arrry.push(arr[i])            obj[arr[i]] = 1        } else {            obj[arr[i]]++        }    }    return arrry;}    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

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

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", {…}]   //所有的都去重了

登录后复制

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

八、利用filter

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

登录后复制

九、利用递归去重

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, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];console.log(unique(arr))//[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]

登录后复制

十、利用Map数据结构去重

function arrayNonRepeatfy(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, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];    console.log(unique(arr))//[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]

登录后复制

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

十一、利用reduce+includes

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, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];console.log(unique(arr));// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

登录后复制

十二、[…new Set(arr)]

[...new Set(arr)] //代码就是这么少----(其实,严格来说并不算是一种,相对于第一种方法来说只是简化了代码)

登录后复制

PS:有些文章提到了foreach+indexOf数组去重的方法,个人觉得都是大同小异,所以没有写上去。

以上就是js数组去重方法的总结的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2725097.html

(0)
上一篇 2025年3月7日 23:20:09
下一篇 2025年3月7日 23:20:17

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js数组怎么去重?

    js数组去重方法:1、使用ES6的Set对象去重;2、利用for嵌套for,然后splice去重;3、利用indexOf去重;4、利用对象的属性不能相同的特点进行去重;5、利用Map数据结构去重;6、利用reduce+includes去重。…

    2025年3月7日
    000
  • JavaScript 中判断变量是否为数字

    今天javascript栏目如何判断变量是否为数字。 大家都说简历没项目写,我就帮大家找了一个项目。 简介 JavaScript 是一种动态类型语言,这意味着解释器在运行时确定变量的类型。实际上,这也允许我们在相同的代码中使用相同的变量来存…

    2025年3月7日
    200
  • 详解JS中的JSON和JSONP

    简单地使用json并不能支持跨域资源请求,为了解决这个问题,需要采用jsonp数据交互协议。众所周知,js文件的调用不受跨域与否的限制,因此如果想通过纯web端跨域访问数据,只能在远程服务器上设法将json数据封装进js格式的文件中,供客户…

    2025年3月7日
    200
  • 详解构建可运行的JavaScript规范的方法

    编程不仅仅是给计算机下达如何完成一项任务的指令,它还包括以一种精确的方式与他人交流思想,甚至是与未来的自己。这样的交流可以有多个目标,也许是为了共享信息,或者只是为了更容易地修改—如果你不理解或不记得很久以前做过什么,那么就很难修改。 当我…

    2025年3月7日
    200
  • 十五条 JavaScript 编程技巧

    .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markd…

    2025年3月7日 编程技术
    200
  • 分享5个JS函数的高级技巧

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。函数对任何一门语言来说都是一个核心的概念,在javascript中更是如此。本文将深入介绍函数的5个高级技巧。 作用域安全的构造函数 构造函数其实就是一个使用new操作符调用的函数…

    2025年3月7日
    200
  • 详解JS中Map和ForEach的差异

    如果你已经有使用JavaScript的经验,你可能已经知道这两个看似相同的方法:Array.prototype.map()和Array.prototype.forEach()。那么,它们到底有什么区别呢? 定义 我们首先来看一看MDN上对M…

    2025年3月7日
    200
  • JS中4种数组遍历方法( for 、forEach() 、for/in、for/of)的区别

    我们有多种方法来遍历 JavaScript 的数组或者对象,而它们之间的区别非常让人疑惑。Airbnb 编码风格禁止使用 for/in 与 for/of,你知道为什么吗? 这篇文章将详细介绍以下 4 种循环语法的区别: for (let i…

    2025年3月7日
    200
  • 详解JavaScript中的作用域和作用域链

    JavaScript 中有一个被称为作用域(Scope)的特性。虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是作用域 作…

    2025年3月7日
    200
  • js怎么跳转到指定页面?

    跳转方法:1、使用“location.href=”指定页面的URL”;”语句跳转;2、使用“location.replace(“指定页面的URL”);”语句跳转;3、使用“location.a…

    2025年3月7日
    200

发表回复

登录后才能评论