操作js数组去重的方法

数组去重算是个老生常谈的问题了,不管是面试还是工作都会有所涉及,去重的方法比较多,不好说谁一定好谁一定差,可根据实际需求进行选择。本文列举一些常见的去重方法,并附上方法优劣与适用场合,如有纰漏请指正。

1. 二重循环对比法:

const array = [1, NaN, '1', null, /a/, 1, undefined, null, NaN, '1', {}, /a/, [], undefined, {}, []];function uniqueByCirculation(arr) {  const newArr = [];  let isRepet = false;    for(let i=0;i 

结果:这里写图片描述,从结果可以看出Array、Object、RegExp进行了保留,NaN没有去重,原因就涉及到“===”的比较机制了,详情可阅:这里写图片描述
此方法时间复杂度O(NlogN),空间复杂度O(N),适用场合:数据类型简单,数据量少。
2. indexOf法:

const array = [1, NaN, '1', null, /a/, 1, undefined, null, NaN, '1', {}, /a/, [], undefined, {}, []];function uniqueByIndexOf(arr) {  return arr.filter((e, i) => arr.indexOf(e) === i);}const uniquedArr = uniqueByIndexOf(array);console.log(uniquedArr);

登录后复制

结果:这里写图片描述
代码简单粗暴,从结果来看,NaN没了,Array、Object、RegExp进行了保留,这是因为Array.indexOf(NaN)总会返回-1,其他复杂类型返回的值总等于自己index,因此得到这样的结果。此方法时间空间复杂度和二重循环一致,适用场合相仿,当然二者相比还是首推这个,毕竟代码短啊。
3. Object[key]法: (个人深度加强版)

const array = [1, '1', NaN, 1, '1',NaN, -0, +0, 0, null, /a/, null, /a/, [], {}, [], {}, [1,2,[2,3]], [1,2,[2,3]], [1,2,[3,2]], undefined,  {a:1,b:[1,2]}, undefined, {b:[2,1],a:1}, [{a:1},2], [2,{a:1}], {a:{b:1,d:{c:2,a:3},c:1},c:1,d:{f:1,b:2}}, {a:{b:1,d:{c:2,a:3},c:1},c:1,d:{f:1,b:2}}];function uniqueByObjectKey(arr) {  const obj = {};  const newArr = [];  let key = '';  arr.forEach(e => {    if(isNumberOrString(e)) { // 针对number与string和某些不适合当key的元素进行优化      key = e + typeof e;    }else {      if(e&&isObject(e)){  // 解决同key同value对象的去重        e = depthSortObject(e);      }      key = JSON.stringify(e) + String(e); //JSON.stringify(e)为了应对数组或对象有子内容,String(e)为了区分正则和空对象{}    }    if(!obj[key]) {      obj[key] = key;      newArr.push(e);    }  });  return newArr;}function isNumberOrString(e){  return typeof e === 'number' || typeof e === 'string';}function isObject(e){  return e.constructor === Object;}function depthSortObject(obj){    if(obj.constructor !== Object){      return;    }    const newobj = {};    for(const i in obj){        newobj[i] = obj[i].constructor === Object ?         sortObject(depthSortObject(obj[i])) : obj[i];     }     return newobj;}function sortObject(obj){  const newObj = {};  const objKeys = Object.keys(obj)  objKeys.sort().map((val) => {      newObj[val] = obj[val];  });  return newObj;}const uniquedArr = uniqueByObjectKey(array);console.log(uniquedArr);

登录后复制

结果:这里写图片描述此方法得到了“深去重*”的结果,因为我在函数中加了一些类型判断改变key,直接暴力object[原始key]会出现number与string被舍一,而且很多类型无法成为key,写函数过程中被JSON.stringify(/a/)坑了,还一直以为是{}的问题·~·,后来输出所以key才发现JSON.string(/a/) === ‘{}’,而String([]) === ”,所以得两个都转然后相加以避免意外。空间复杂度为O(N),时间复杂度为O(N),适用于想深度取重的场合(*:深去重我自个儿想的名字,因为对象是本身无序的,即{a:1,b:2}应该与{b:2,a:1}等价,所以深度去重把Object内部key:value都相同也进行去重)。
4. ES6 Set法:

const array = [1, NaN, '1', null, /a/, 1, undefined, null, NaN, '1', {}, /a/, [], undefined, {}, []];function uniqueByES6Set(arr) {  return Array.from(new Set(arr))  // return [...new Ser(arr)]}const uniquedArr = uniqueByES6Set(array);console.log(uniquedArr);

登录后复制

结果:这里写图片描述
从结果看Array、Object、RegExp进行了保留,此方法原理是ES6的新数据结构Set,里面存储无序不重复数据,Set结构详情参阅:Set与Map-阮一峰,空间复杂度O(N),时间复杂度位置,·这方法速度很快,保留复杂对象时直接用这个最好咯。
5. ES6 Map法:

const array = [1, NaN, '1', null, /a/, 1, undefined, null, NaN, '1', {}, /a/, [], undefined, {}, []];function uniqueByES6Map(arr) {  const map = new Map();  return arr.filter(e => {    return map.has(e) ? false : map.set(e, 'map')  })}const uniquedArr = uniqueByES6Map(array);console.log(uniquedArr);

登录后复制

结果:这里写图片描述结果和用Set时一样的,主要用到了ES6的新数据结构Map,Map以key-value组映射存储,特点是key可以为任意类型,通过hash地址映射数据,时间复杂度O(1),空间复杂度比O(N),不过实际花费地址比Set的大些,也适用于保留复杂对象的情况。

本文记载了五种较为常见的数组除重方式,原则上直接用ES6的Set来的最快,如果有要除对象数组的可以使用第三种,当然第三种稍微一改结果就和后面的一样了

数组去重算是个老生常谈的问题了,不管是面试还是工作都会有所涉及,去重的方法比较多,不好说谁一定好谁一定差,可根据实际需求进行选择。本文列举一些常见的去重方法,并附上方法优劣与适用场合,如有纰漏请指正。

相关推荐:

PHP数组去重较快的实现方式

JS数组去重方法总结

js的数组去重实例详解

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

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

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

(0)
上一篇 2025年3月8日 14:55:12
下一篇 2025年3月8日 14:55:22

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

相关推荐

  • 在spring mvc 返回json数据到ajax报错应该如何处理

    这次给大家带来在spring mvc 返回json数据到ajax报错应该如何处理,处理在spring mvc返回json数据到ajax报错的注意事项有哪些,下面就是实战案例,一起来看一下。 最近使用ajax接收spring mvc传过来的j…

    编程技术 2025年3月8日
    000
  • 简单理解Vue条件渲染_vue.js

    这篇文章主要帮助大家简单理解vue条件渲染,什么是vue条件渲染,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一、v-if显示单个元素 注意else只能跟在v-if或者v-show后面 nbsp;html>   Vue条件渲染 …

    编程技术 2025年3月8日
    200
  • angularJS实现简易购物车的方法

    本文主要和大家分享angularJS实现简易购物车的方法,希望能帮助到大家。 nbsp;html>        我的购物车     * { margin: 0; padding: 0; } table { border-collap…

    2025年3月8日
    200
  • js引擎的执行机制详解

    本文主要和大家分享js引擎的执行机制详解,希望能帮助到大家。 首先,请牢记 2 点: js 是单线程语言 js 中的 event loop 是 js 的执行机制。深入了解 js 的执行,就等于深入了解 js 里的 event loop js…

    2025年3月8日
    200
  • ajax的前端与后端交互的方法

    这次给大家带来ajax的前端与后端交互的方法,ajax前端与后端交互的注意事项有哪些,下面就是实战案例,一起来看一下。 前端中常常用的与后端交换数据的话,通常是要用到ajax这种方法的 但是交互的方式有很多种,很多取决于你后端的属性,我这儿…

    编程技术 2025年3月8日
    200
  • 初探nodeJS_node.js

    本文主要介绍了nodejs的基础知识。具有很好的参考价值,有需要的朋友可以看一下 一、node概要 对nodeJS早有耳闻,但是一直迟迟没有对它下手,哈哈哈,今儿咱就来初探一下它。 nodeJS是个啥东东? nodeJS,我的理解就是可以运…

    2025年3月8日 编程技术
    200
  • js中数组和字符串的操作方法

    本文主要和大家分享js中数组和字符串的操作方法,主要以文字和代码的形式和大家分享,希望能帮助到大家。 1.数组的操作方法 // 1.数组的操作方法var a = [];a.unshift()/*在数组的开头添加一个或者多个元素,返回新长度;…

    编程技术 2025年3月8日
    200
  • JS中单线程和事件循环详解

    Js 是单线程,js代码从上到下依次执行,比如我们写了两个函数,肯定是上面的函数先执行,下面的函数后执行。但是这种单线程有一个非常大的问题,那就是遇到耗时的任务,后面的任务只能等待它执行完,才能进行。比如ajax 请求,它从服务器上获取数据…

    2025年3月8日 编程技术
    200
  • javascript日期操作详解(整理)_时间日期

    本篇文章给大家分享的是javascript日期操作详解,内容挺不错的,希望可以帮助到有需要的朋友 时间对象是一个我们经常要用到的对象,无论是做时间输出、时间判断等操作时都与这个对象离不开。除开JavaScript中的时间对象外,在VbScr…

    编程技术 2025年3月8日
    200
  • js中delete操作符与内部属性实例详解

    本文主要和大家分享js中delete操作符与内部属性实例详解,在讲解Configurable之前,我们首先来看一道面试题: a = 1;console.log( window.a ); // 1console.log( delete win…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论