登录  /  注册
首页 > web前端 > js教程 > 正文

实例详解javascript数组去重的几种思路

小云云
发布: 2018-02-08 16:14:00
原创
1286人浏览过

数据去重的需求实际上像是lodash这些工具库已经有成熟完备的实现,并且可以成熟地运用于生产环境。但是这并不妨碍我们从思维拓展的角度出发,看看去重可以用几种思路去实现。本文主要和大家分享javascript数组去重的几种思路。

首先是常规的双层循环比对的思路实现

function doubleLoopUniq(arr) {
  let result = [];
  for (let i = 0, len = arr.length, isExist; i <p>借助 js内置的indexOf 进行去重</p><pre class="brush:php;toolbar:false">function indexOfUniq(arr) {
  let result = [];
  for (let i = 0, len = arr.length; i <p>排序后前后比对去重</p><pre class="brush:php;toolbar:false">function sortUniq(arr) {
  let result = [], last;
  // 这里解构是为了不对原数组产生副作用
  [ ...arr ].sort().forEach(item =&gt; {
    if (item != last) {
      result.push(item);
      last = item;
    }
  });
  return result;
}
登录后复制

通过hashTable去重

function hashUniq(arr) {
  let hashTable = arr.reduce((result, curr, index, array) =&gt; {
    result[curr] = true;
    return result;
  }, {})
  return Object.keys(hashTable).map(item =&gt; parseInt(item, 10));
}
登录后复制

ES6 SET一行代码实现去重

function toSetUniq(arr) {
  return Array.from(new Set(arr));
}
登录后复制

splice 去重(直接操作数组本身,带副作用)

function inPlaceUniq(arr) {
  let idx = 0;
  while (idx <p>最后在nodejs下面简单跑个测试,看看哪个效率高~</p><pre class="brush:php;toolbar:false">let data = [];
for (var i = 0; i <p>结果如下</p><pre class="brush:php;toolbar:false">hashTable 168ms
sortUniq 332ms
toSetUniq 80ms
indexOfUniq 4280ms
doubleLoopUniq 13303ms
inPlaceUniq 9977ms
登录后复制

延伸思考: 如果数组内的元素是对象该怎么去重呢?

既然是引用类型,那么不免会使用到deepEqual,固然这种思路可以解答这道问题,但难免不够高效。

从上面的测试中也可见通过new Set 和 hashTable 去重是最高效的。
所以毫无疑问,我们要基于这两种方式去改造,我想用的是hashTable,
另一方面,为了降低深度比较带来的耗时,我尝试用JSON.stringify 将引用类型转化为基本类型。

function collectionUniq(collection) {
  let hashTable = {};
  collection.forEach(item =&gt; {
    hashTable[JSON.stringify(item)] = true;
  })
  return Object.keys(hashTable).map(item =&gt; JSON.parse(item))
}
登录后复制

那么问题来了,我们都知道对象的属性是无序的,假如数据是这种情况,那就GG了。

let collection = [ { a: 1, b: 2, c: 3 }, { b: 2, c: 3, a: 1 } ]
登录后复制

有一种toHash的思路,在对这个数组进行一次基本的去重之后,为了保证准确,
先遍历JSON 字符串 =>
通过 charCodeAt()拿到每个字符串 的 unicode 编码 =>
相加得到一个总数,最后再两两进行比较,数值相等的就是重复的,这样就达到去重的效果了。

function toHash(obj) {
  let power = 1;
  let res = 0;
  const string = JSON.stringify(obj, null, 2);
  for (let i = 0, l = string.length; i <p>这只是一个实现基本的思路,有很大的改进空间,为了减少hash碰撞的可能,可以对一些特殊字符进行权重的增减。</p><p><strong>重点是保证碰撞的几率小到比中大奖还小就可以了。</strong></p><p class="comments-box-content">相关推荐:<br></p><p class="comments-box-content"><a href="http://www.php.cn/js-tutorial-386521.html" target="_self">JavaScript数组去重的几种方法分享</a></p><p class="comments-box-content"><a href="http://www.php.cn/php-weizijiaocheng-386230.html" target="_self">PHP实现数组去重的方法代码</a></p><p class="comments-box-content"><a href="http://www.php.cn/js-tutorial-384672.html" target="_self">JS简单实现数组去重的方法分析</a></p>
登录后复制

以上就是实例详解javascript数组去重的几种思路的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号