javascript数组去掉重复
JavaScript数组 重复 去掉
2023-06-13 09:14:28 时间
总得来说面试的过程还是收获了不少,主要是认清自己的差距到底有多大,知识面到底有多窄,适当打击一下自信心还是有必要的。在这里做一次全面的总结,关于javascript的数组去重问题。
考虑一个问题由简到繁相对容易接受一点,首先假设要去重的数组是比较简单的,例如:
复制代码代码如下:
考虑一个问题由简到繁相对容易接受一点,首先假设要去重的数组是比较简单的,例如:
vararr=[1,2,2,3,"5",6,5,"",""]
这个数组只包含了数字,字符串两种类型。我们给数组原型上面添加去重的方法distinct,用第一种很容易想到的方法来实现,当然也是很笨很直接的,把这个数组复制一份然后循环两个数组,对比当前值与后面所有的值是否相等,如果与后面所有值都不等则把该值存到新数组里,如此最后再返回该新数组。方法如下:
//第一种方法
Array.prototype.distinct=function(){
varclone,newArr=[],n=0;
if(this.length<2)return;
clone=this;
for(vari=0,len=this.length;i<len;i++){
for(varj=i+1,len2=clone.length;j<len2;j++){
if(this[i]!==clone[j]){
n++;
}
}
if(n==(len-i-1)){
newArr.push(this[i])
}
n=0;
}
returnnewArr;
}
console.log([1,2,2,3,"5",6,5,"",""].distinct());
/*获得被check的radio的值*/
functionGetRadioValue(RadioName){
varobj;
obj=document.getElementsByName(RadioName);
if(obj!=null){
vari;
for(i=0;i<obj.length;i++){
if(obj[i].checked){
returnobj[i].value;
}
}
}
returnnull;
}
/*设置被选中属性*/
functionSetRadioCheck(RadioName,i){
varobj;
obj=document.getElementsByName(RadioName);
obj[i].setAttribute("checked","checked");
}
基本可以满足我们的需求,对这样简单的类型比较确实不用费太多的脑经,但如果数组很长呢?如此遍历数组,数组长度为n,那么时间复杂度为n*n。显然该方法性能还有待提升。接下来是第二种方法,用到数组排序,在排序的过程去除重复的值。
//第二种方法
Array.prototype.distinct=function(){
varnewArr=this.concat().sort(),self=this;
newArr.sort(function(a,b){
varn;
if(a===b){
n=self.indexOf(a);
self.splice(n,1);
}
});
returnself;
}
console.log([1,2,2,3,"5",6,5,6,6,15,5,"5",5,"",""].distinct());
这样代码看起来似乎短了很多,甚至连一个for循环都没有,但是sort得效率也高不到哪里去。再来看看第三种实现方法,用到的对象属性不会重名的原理
//第三种方法
Array.prototype.distinct=function(){
varnewArr=[],obj={};
for(vari=0,len=this.length;i<len;i++){
if(!obj[this[i]]){
newArr.push(this[i]);
obj[this[i]]="new";
}
}
returnnewArr;
}
console.log([1,2,2,3,"5",6,5,6,6,15,5,"5",5,"",""].distinct());
第三种方法运行看下结果,会发现跟上面的方法实现的结果不一致,细看原来它把数字5和字符串5当成重复的值给去掉了。看来类型必须保存起来然后再判断是否相等,这样便有了下面的第三种方法的补充版
//第三种方法补充版
Array.prototype.distinct=function(){
varnewArr=[],obj={};
for(vari=0,len=this.length;i<len;i++){
if(!obj[typeof(this[i])+this[i]]){
newArr.push(this[i]);
obj[typeof(this[i])+this[i]]="new";
}
}
returnnewArr;
}
上面举的例子是很简单的类型,我们拿更复杂的类型来测试一下
console.log([1,null,2,{a:"vc"},{},"5",6,5,6,{a:"vv"},15,5,"5",5,"","",[1],[1],[1,2],,].distinct());
发现{a:"vc"},{},{a:"vv"}这些不同的对象还是会被剔除掉,如果数组里面有对象则要继续遍历对象里面的属性和值,继续第三种方法的加强
//第三种方法加强版
Array.prototype.distinct=function(){
varsameObj=function(a,b){
vartag=true;
if(!a||!b)returnfalse;
for(varxina){
if(!b[x])
returnfalse;
if(typeof(a[x])==="object"){
tag=sameObj(a[x],b[x]);
}else{
if(a[x]!==b[x])
returnfalse;
}
}
returntag;
}
varnewArr=[],obj={};
for(vari=0,len=this.length;i<len;i++){
if(!sameObj(obj[typeof(this[i])+this[i]],this[i])){
newArr.push(this[i]);
obj[typeof(this[i])+this[i]]=this[i];
}
}
returnnewArr;
}
用上面的例子测试发现基本木有问题,当然测试还可以更加变态更加纠缠,这里就不去深究了,目前来看此篇方法在网上属于比较齐全的,如果有更好更完善的方法请不吝赐教。
相关文章
- Javascript数组排序sort方法和自定义排序方法
- JavaScript数组方法总结
- 【说站】javascript数组如何判断是否存在指定值
- JavaScript异步函数asyncu002Fawait
- JavaScript 基本数据类型和引用数据类型
- 使用JavaScript的数组实现数据结构中的队列与堆栈详解编程语言
- javascript sort进行二维数组排序详解编程语言
- 小议Function.apply()之二------利用Apply的参数数组化来提高JavaScript程序性能
- javascript入门·对象属性方法大总结
- javascript中的array数组使用技巧
- Javascript去除数组的重复元素
- JavaScript去掉数组中的重复元素
- JavaScript中去掉数组中的重复值的实现方法
- JavaScript基础篇之对象、数组使用介绍(三)
- JavaScript参数中的数组展开[译]
- JavaScript语言核心数据类型和变量使用介绍
- JavaScript获取多个数组的交集简单实例
- javascript中数组的sort()方法的使用介绍
- javascript删除数组元素并且数组长度减小的简单实例
- javascript简单实现图片预加载
- JavaScript实现查找字符串中第一个不重复的字符
- JavaScript中document对象使用详解
- javascript面向对象之对象的深入理解