数组和算法-数组去重

<h1>数组去重</h1>

<blockquote>
<p>之前一段时间一直在准备面试, 因而博客太久没更新; 现在基本知识点都复习完毕, 接下来就分享下 面试的一些常见问题:

去正规的互联网公司笔试、面试有很大的概率会碰到 使用javascript实现数组去重的编码问题:下面笔者就介绍几种数组去重的方法</p>
</blockquote>

<h2>利用对象的键值对方法去重</h2>

<p>思路:</p>

<ol>
<li>我们把数组中的每一项的值当做一个对象的属性名和属性值存储起来</li>
<li>但是我们在存储之前,我们首先判断当前这一项(N)是否在对象中已经存在了->obj[N],如果值是N(我们已经把值和属性名存储成是一样的),说明对象中已经存在这一项了,如果值是undefined,说明对象中还没有这一项</li>
<li>如果值是N,说明对象中已经存在这一项,同时也说明在N之前数组中已经出现过一次N了,即这一项已经重复,我们从数组中把这一项删掉,如果值是undefined,说明对象中还没有这一项,也说明这一项以前没有在数组中出现过,我们把当前值存储进去即可</li>
</ol>

<p>```</p>

<p>比如:</p>

<p>var obj = {};
obj[1] -> undefined {1:1}
obj[2] -> undefined {2:2}
obj[3] -> undefined {3:3}
obj[2] -> 2 {1:1}
obj[1] -> 说明第四项2在之前出现过,我们把第四项删除</p>

<p>```
思路我们就分析完了,现在具体写这个方法</p>

<p>```
var ary = [1,2,3,2,3,2,3,1,2,3,4,2,3,1];
var obj = {};
for(var i=0;i<ary.length;i++){
var cur = ary[i];//此处是遍历数组 ary[1]=1,2,3,2......同是
把这个值赋值给cur即cur=1,2,3,2...此时我们就能让属性名和属性值相
同。var 1= 1;var 2 = 2 ...;
if(obj[cur]==cur){//我们把属性名和属性值,存储到对象中,即
obj[1]和1,如果对象中obj[1]的值和你存储cur的值相同,则满足此条
件,但是我们存储第一项的时候对象中obj[1]还没有值,即undefined,所以
第一项不满足。如果满足,我们就删除数组中的这一项
ary.splice(i,1);//即把第i项删除->splice方法,从第i项删除一
个,注意,删除后,会有数组塌陷,所以我们要i--
i--;</p>

<pre><code> }else {//不满足if条件,走此步。
obj[cur] = cur;//把数组里的值,存储到对象中。以便用此条件给后面
的条件进行判断
}
}
console.log(ary);
</code></pre>

<p>```</p>

<p>结果为 [1, 2, 3, 4]</p>

<p>这是一种方法,但是这种方法并不完美,因为有数组塌陷问题,对系统性能有一定影响</p>

<p>下面这是升级改进的方法。

在上面的思路上,我们可以不用splice方法,如果对象中属性名和属性值一样,我们可以把比较的当前项,用最后面的一项替换掉,然后把最后一项删除即可,注意:仍要用i--;因为拿过来,还没有比较,还要再次走一遍if条件对新值进行比较。</p>

<p>```
var ary = [1,2,3,2,3,2,3,1,2,3,4,2,3,1];
var obj = {};
for(var i=0;i<ary.length;i++){
var cur = ary[i];
if(obj[cur]==cur){
ary[i] = ary[ary.length-1];//我们把最后一项,替换掉当前项
ary.length--;//删除掉最后一项,即把数组长度缩小一位即可。
i--;</p>

<pre><code> }else {//不满足if条件,走此步。
obj[cur] = cur;//把数组里的值,存储到对象中。以便用此条件给后面的条件进行判断
}
}
console.log(ary);
</code></pre>

<p>```
结果为 [1, 2, 3, 4]</p>

<p>以上方法是在原数组中操作,其实我感觉并不是最好的方法,假如在数组中有不同类型的相同值得项呢?我们可以另定义一个新数组,然后在加上类型的判断,这种方法就不很细的解读了。写上以便读者参考</p>

<p><code>var ary = [3,2,3,1,4,true,false,"3","22","2",2];
function noRepeat(ary) {
var newAry = [];
var obj = {};
for(var i=0;i<ary.length;i++){
if(!(obj[ary[i]+typeof ary[i]])){//此处将obj的属性值用值+类型的方式存储起来,比如第一项obj[3number];如果该属性名的值不存在,则在此处执行
newAry.push(ary[i]);
obj[ary[i]+typeof ary[i]] = 1;//此处把该对象的属性名的值随便赋值成一个东东,比如1,以后判断的时候,证明该属性名的值存在
}
}
return newAry;// 此函数的最终目的是返回新的数组。
}
var res = noRepeat(ary);//执行此函数,并赋值给res,即res = newAry;
console.log(res);</code></p>

<p>结果为 [3, 2, 1, 4, true, false, "3", "22", "2"]</p>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • * 基础知识 * js的输出方式 * js的组成 * js的命名规范 * 数据类型 * number数据类型 * ...
    web前端ling阅读 992评论 0 2
  • 数组方法的小总结 从数组末尾删除一项,有哪些方法?ary.length--ary.length-=1; ary.l...
    固执_i阅读 205评论 0 0
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,053评论 1 10
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • “ 妈,你又被骗了”8岁儿子淡定的看着我,我看着混在刚买的一大袋橘子里面的几个烂了点点的橘子,心里有点难受。为什么...
    晓卉669阅读 402评论 0 0