顺晟科技
2021-06-16 10:40:43
202
说到重复数据消除,实现很多,在ES6下根本不是问题。但是,在ES6之前.习惯性的思路是复制一个新集合,遍历并与原集合进行比较,类似于下面的实现方法:
var uniq1=function(arr){
var temp=[],
项目,
I,n;
for(I=0;iarr.lengthI=1){//开始重复数据删除
item=arr[I];
temp.push(项目);
for(n=0;ntemp.lengthn=1){
If(item===temp[n-1]){//如果temp和arr中的元素重复,则删除。
温度拼接(温度长度-1,1);
}
}
}
返回温度;
};
上面的示例将创建一个临时的空数组对象,当元素被一个接一个地放入其中时,该对象将与前一个元素进行比较。如果值相同,它将从临时数组中删除,直到遍历完所有比较对象.这种方法尽可能优化性能,但是存在嵌套循环,代码实现逻辑复杂,对部分读者不友好,对吗?以下描述了一种可能降低压力并表现良好的实施方法。
先说思路。我们习惯于通过逐个比较数组元素来获取重复值,这就把程序员的思维局限于数组。事实上,js World为我们提供了一个现成的对象{}用于重复数据消除。因为对象的键名是的,所以我们可以通过使用该值作为对象的键名来实现重复数据消除。所以:
var uniq2=function(arr){
var i,temp=[],
key,NewArr=[];
for(I=0;iarr.lengthI=1){//遍历数组,将值作为键名放入对象中
temp[arr[I]]=(temp[arr[I]]1)| | 1;//对象值是随便赋值的,作为重复次数的统计是个不错的选择
}
For(键入temp){//将生成的临时对象传输回数组
newArr.push(键);
}
返回newArr
};
逻辑清晰,效果很好。因为直接覆盖了对象的键名,所以不需要比较重复的值,循环体的计算复杂度大大降低,在做大量数据操作的时候性能会明显提高,因为反正只是遍历数组。我们写一个简单的测试,得到以下结果,
优势明显!但是有一个新问题。我们遍历,发现所有的值都变成了字符串!另外,如果是对象集的重复数据消除呢?我们知道一个对象的键名是字符串,所以不能直接从字面上使用该对象。真的没有银弹!怎么办?我们还是遵循“懒人风格”,用现成的方法jsON。JS提供的Stringify()将对象转换成字符串,在重复数据删除完成后使用JSON.parse()转换对象的文字值.嗯,太容易了,我就又偷懒了,你也很容易自由的玩完整的实现代码。
据说写一个ES6代码,用巴别塔转换比较好.但是用户的需求是无止境的,有些人还是不放弃对ie8的支持。而且我发现第二种方法还是优于[.即使使用JSON解析,性能也有所提高:
也许这个数据量还不足以显示这种方法的巨大优势。我们再用一些材料来测试一下。
关于去重还有很多话题需要讨论,比如算法及其对结果排名的影响,但归根结底还是性能优化和高效处理。这是一个很有意思的话题!
28
1990-12
02
2022-09
29
2021-08
29
2021-08
29
2021-08
28
2021-08