js 中基础数据结构数组去重问题

阅读 1242
收藏 76
2017-01-06
原文链接:www.jianshu.com

引言

一说到数据结构,很多人就开始头大了,因为总感觉像什么数据结构,算法之类的概念都很高大上,我知道有很多的同学都是毕业后觉得编程高薪,亦或培训速成所以就选择了一门语言,从而从事了这个行业,但是对于编程语言的一些基础,以及相关的系列知识结构其实是缺失的,所以业余时间多花点功夫多学习,其实都是可以补上来的,拿我自己举例子吧,我学的专业虽然不是“计算机科学与技术”也不是“软件工程”这样纯计算机的专业,但是是和计算机专业相关的学科,所以上学的时候,接触过C,Java,C#等语言,也有一些数据结构的概念,数据库操作也略知一二,也系列的学过计算机网络基础等课程,虽然上学的时候学的不好也不精,但至少的思想和概念是有的,所以在此也给一些刚刚入技术,或者转行的同学一点提示,除了本职的技术语言和繁忙的业务逻辑之外,这些基础概念还是应该要补上来的。

一.什么是数据结构

数据结构是一种存储和组织数据的方式

至于我是什么时候有了关于“数据结构” 这个概念,应该是今年的7月份起,加入了目前的公司,接触复杂的业务逻辑,处理复杂的数据,公司有专门的几十人团队的大数据部门,所以可想而知,每次处理接口返回过来的数据,不再是以前单一结构的数据,而是相对比较复杂,设计合理的接口数据,那么这个时候你直接拿到数据,并不是可以直接使用的,它需要你做二次处理之后才能用了展示或者处理逻辑用的数据

举个栗子

比如我们获取到了一段这样的数据,但是临时我们需要往数据中再加一个字段,比如需要给每一项加一个“country"这个字段,因此我们就需要将这组数据进行一个处理,数组是最简单的内存数据结构,js中以及几乎所有的语言都支持数组类型,所以学好js中的数据结构,首先要学习的就是对数组的处理


一些数据片段

javascript语言一直不断的完善和更新,去年有了es6,今年又有了es7,数组中涉及的方法和API也是在不断的完善,本文不介绍es5之后的方法扩展,需要的同学请查看相关的资料学习,先来概览一下常用的可以高效处理数组的方法,这些方法可以在日常工作中帮我们处理很多简单的逻辑

处理数据时常用的:具有遍历作用的方法

forEach(),map(), some()/every(), filter(),reduce()/reduceRight()方法都具有一个遍历作用,但是它们在遍历的同时还具有其特定的功能,以上这几个方法是我在处理数组数据时常用的方法,之前没有使用过或者使用不全的同学可以去搜索一下它们各自的功能

二.数组去重

思考?如何去除数组中重复的项

例如数组:[1,3,4,3,5]我们在做去重的时候,一开始想到的肯定是,逐个比较,外面一层循环,内层后一个与前一个一比较,如果是久不将当前这一项放进新的数组,挨个比较完之后返回一个新的去过重复的数组


不好的实践方式

上述方法效率极低,代码量还多,思考?有没有更好的方法

这时候不禁一想当然有了!!!hashtable 啊,通过对象的hash办法可以有效的去除掉重复的内容


成功输出去重后的数组

?既然数组的方法都已经如此完善了,岂不是有更好的遍历方法


使用forEach替代for循环

最后!如果数组中重复出现的并不是简单的数据类型,每一项都是一种复杂的对象类型的数据结构该如何去重呢?

例如数组是这样的:


第一项和最后一项重复

其实还是利用hash的思想,但是转化一下思维,比如我们可以把这个数组中的每一项当作一个对象的属性也,然后枚举这个属性


附上小方法


解析:上面这个方法呢利用Object.keys()这个方法枚举我们去重后的一个对象unique,这个方法返回一个属性列表数组,之后我们利用数组的map()方法遍历并且给每一项执行一个callback,map()会返回一个新的数组

完结

以上的小栗子,由最开始我们的古老思想和低效方法逐步到最后数组去重复杂项,这一个个过程都体现了数组的乐趣所在,同时也体现出了数据结构的魅力之处,数组只是一种简单的数据结构,还有很多更复杂更有意识的知识等待我们去挖掘,也希望小伙伴可以跟我分享更多的知识和乐趣,2107年欢迎你和我一起做一个不断努力学习的知识分子

说明:文章中的图片均出于本人截图,文字均属原创,转载请注明出处

Cayley 一个不断努力学习的女程序员




评论