JavaScript数组去重算法实例小结
本文总结了JavaScript中三种常见的数组去重算法。方法一利用临时数组和indexOf,时间复杂度为O(n^2)且无法区分对象;方法二使用Object作为哈希表,能解决对象问题但混淆数字1与字符串"1";方法三通过sort排序后比较相邻元素,仅适用于纯数字数组。文章详细分析了各方法的测试结果及潜在Bug,并提供修正方案。
JavaScript数组去重算法实例小结
本示例汇总了JavaScript实现数组去重的多种算法。供参考学习,详情如下:
测试数据:
arr = ["1",3,"1",1,4,5,1,"2",5,1,{"name":"li","age":20},2,4,3,{"name":"li","age":20},""];
基于临时数组与indexOf的去重方法
方案一:利用临时数组配合indexOf方法,算法时间复杂度为O(n^2)
function unique1(arr){
var temp = [];
for(var i=0; i<arr.length; i++){
if(temp.indexOf(arr[i]) == -1){
temp.push(arr[i]);
}
}
return temp;
}
运行结果:
unique1(arr) : ["1", 3, 1, 4, 5, "2", Object { name="li", age=20}, 2, Object { name="li", age=20}, ""]
缺陷:无法正确区分对象实例
基于Object哈希表的去重方法
方案二 : 利用JavaScript中的Object对象充当哈希表
function unique2(arr){
var temp=[];
var hash={};
for(var i=0; i<arr.length;i++){
if(!hash[arr[i]]){
hash[arr[i]]=true;
temp.push(arr[i]);
}
}
return temp;
}
运行结果:
unique2(arr) : ["1", 3, 4, 5, "2", Object { name="li", age=20}, ""]
缺陷:无法区分数值1与字符串"1"
修正代码
function unique2(arr){
var temp=[];
var hash={};
for(var i=0; i<arr.length;i++){
var item = arr[i];
var key = typeof(item)+item;
if(!hash[key]){
hash[key]=true;
temp.push(arr[i]);
}
}
return temp;
}
运行结果:
unique2(arr) : ["1", 3, 1, 4, 5, "2", Object { name="li", age=20}, 2, ""]
基于排序与临时数组的去重方法
方案三:先对数组执行sort排序,再借助临时数组保留相同元素的最后一个,此方法仅适用于纯Number类型数组
function unique3(arr){
arr.sort(function(a,b){
return a-b;
});
var temp = [];
for(var i=0;i<arr.length;i++){
if(arr[i] !== arr[i+1]){
temp.push(arr[i]);
}
}
return temp;
}
PS:此处推荐几款辅助工具供参考:
在线去重工具: http://tools.jb51.net/code/quchong
在线文本去重工具: http://tools.jb51.net/aideddesign/txt_quchong
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数组操作技巧总结》、《JavaScript字符与字符串操作技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript排序算法总结》、《JavaScript查找算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
JS使用constructor判断数据类型可靠吗
2026-11-05 13:49:41
