博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript中数组去重的4种方法
阅读量:6894 次
发布时间:2019-06-27

本文共 1570 字,大约阅读时间需要 5 分钟。

面试前端必须准备的一道问题:怎样去掉Javascript的Array的重复项。在最近面试中,百度、腾讯、盛大等都在面试里出过这个题目。这个问题看起来简单,但其实暗藏杀机。 考的不仅仅是实现这个功能,更能看出你对计算机程序执行的深入理解。

我总共想出了三种算法来实现这个目的:
方法一:

Array.prototype.unique1 =
function
()
{
    
var
n = [];
//一个新的临时数组
    
for
(
var
i = 0; i <
this
.length; i++)
//遍历当前数组
    
{
        
//如果当前数组的第i已经保存进了临时数组,那么跳过,
        
//否则把当前项push到临时数组里面
        
if
(n.indexOf(
this
[i]) == -1) n.push(
this
[i]);
    
}
    
return
n;
}
 
方法二:
Array.prototype.unique2 =
function
()
{
    
var
n = {},r=[];
//n为hash表,r为临时数组
    
for
(
var
i = 0; i <
this
.length; i++)
//遍历当前数组
    
{
        
if
(!n[
this
[i]])
//如果hash表中没有当前项
        
{
            
n[
this
[i]] =
true
;
//存入hash表
            
r.push(
this
[i]);
//把当前数组的当前项push到临时数组里面
        
}
    
}
    
return
r;
}
 
方法三:
Array.prototype.unique3 =
function
()
{
    
var
n = [
this
[0]];
//结果数组
    
for
(
var
i = 1; i <
this
.length; i++)
//从第二项开始遍历
    
{
        
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
        
//那么表示第i项是重复的,忽略掉。否则存入结果数组
        
if
(
this
.indexOf(
this
[i]) == i) n.push(
this
[i]);
    
}
    
return
n;
}
 
其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。
而第2中方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多。
为了判断这三种方法的效率如何,我做了一个测试程序,生成一个10000长度的随机数组成的数组,然后分别用几个方法来测试执行时间。 结果表明第二种方法远远快于其他两种方法。
但是内存占用方面应该第二种方法比较多,因为多了一个hash表。这就是所谓的空间换时间。
就是这个测试页面,你也可以去看看。
根据网上大牛的思路,我写了第四种方法:
Array.prototype.unique4 =
function
()
{
    
this
.sort();
    
var
re=[
this
[0]];
    
for
(
var
i = 1; i <
this
.length; i++)
    
{
        
if
(
this
[i] !== re[re.length-1])
        
{
            
re.push(
this
[i]);
        
}
    
}
    
return
re;
}
这个方法的思路是先把数组排序,然后比较相邻的两个值。
排序的时候用的JS原生的sort方法,JS引擎内部应该是用的快速排序吧。
最终测试的结果是此方法运行时间平均是第二种方法的三倍左右,不过比第一种和第三种方法快了不少。
 
 
本文转到:http://www.csstop.com//interview/20151109/4946.html

转载地址:http://kpzdl.baihongyu.com/

你可能感兴趣的文章
《深入理解大数据:大数据处理与编程实践》一一1.3 MapReduce并行计算技术简介...
查看>>
LoadRunner关联的高级应用
查看>>
如何减少返工工作量?
查看>>
《敏捷可执行需求说明 Scrum提炼及实现技术》—— 2.1 界定不可更改的边界
查看>>
关注安防行业 聚焦公共安防系统
查看>>
Android代码(Handler的运用),HttpURLConnection的应用,将url图片地址转换成图片。...
查看>>
MySQL锁系列(七)之 锁算法详解
查看>>
webOS 更名 LuneOS,新版本名为 Affogato
查看>>
《UNIX环境高级编程(第3版)》——导读
查看>>
11_Eclipse中演示Git版本的创建,历史版本的修改,创建分支,合并历史版本和当前版本...
查看>>
《实施Cisco统一通信管理器(CIPT1)》一1.2 CUCM概述
查看>>
《容器技术系列》一1.1 引言
查看>>
Ceylon IDE 1.2.0 首个维护版本发布
查看>>
《SolidWorks 2016中文版机械设计从入门到精通》——1.8 参考点
查看>>
《互联网+流通——F2R助力传统产业创新与转型》一一1.1 “互联网+”的本质、演进与发展趋势...
查看>>
在经历诸多坑后,Sonar@OSC 重新上线
查看>>
超过 35 万软件包 npm 是世界上最大的包管理器
查看>>
《SolidWorks 2017中文版机械设计从入门到精通)》——1.8 参考点
查看>>
《CUDA C编程权威指南》——2.3 组织并行线程
查看>>
Popcorn Time 的 Github 库被 MPAA 关闭
查看>>