JavaScript去除数组重复值的实现思路与代码解析

作者:纸飞机时间:2026-10-26 12:02:54浏览:296

本文介绍了一种利用JavaScript对象属性唯一性来去除数组重复值的方法。通过遍历数组并将元素作为键存入对象,利用对象键不重复的特性实现去重,相比双重循环或排序法具有更好的性能。文章还探讨了该思路在美团面试变种题中的应用,即在Array原型上添加去重方法。

代码如下:

 
数组去重问题描述与示例题目要求编写一个函数,用于移除给定数组中的重复元素。
例如:
输入数组 a = [0, 8, 5, 4, 78, 8, 90, 4, 'a', 'b', 'a'];
期望返回结果:[0,4,5,8,78,90,a,b]

针对此问题,面试后我反复思考多次,始终未能找到时间复杂度较低的理想方案。直到昨天下午在宿舍阅读《JavaScript语言精粹》时,书中的一段代码给了我启发。随后我在jsfiddle上进行测试并成功实现。完整代码如下(完整版参见jsfiddle)


基于对象属性的去重实现

代码如下:

 
var getNR = function(src) {
src = src || [];
var res = {};
var curr = [];
var i, j = 0,temp, name;
for (i = 0; i < src.length; i++) {
temp = src[i];
if (res[temp]) {
//do noting
} else {
res[temp] = 1;
} 
} 
for (name in res) {
if (res.hasOwnProperty(name)) {
curr[j++] = name;
} 
} 
return curr;
}; 

三种解题思路对比分析

总结一下我的思路:


思路一:对目标数组进行排序,然后依次删除重复元素。但这种方法在删除重复项的同时会改变数组原有元素的顺序,显然不符合要求,因此排除。


思路二:新建一个数组b,将a中的元素push到b中,但在push之前检查该元素是否已存在。这种方法的时间复杂度是n*n,虽然最简单但也最笨拙。


思路三:与思路二类似,但充分利用了JavaScript对象的属性特性。新建一个空对象,将a中的元素作为属性添加到该对象中,在添加之前检测该属性是否已存在。全部添加完毕后,将该对象的属性依次放入数组中并返回。


面试变种:Array原型方法扩展

美团面试的题目中有一道这个题目的变种:


要求在Array类上添加一个方法,对于任意数组调用该方法后,去除该数组中的重复元素。


这个变种题考查的知识点多了些,还包括原型,this的理解等。

作者最新文章