Javascript教程:Javascript数组去重问题

http://www.itjxue.com  2015-08-06 23:00  来源:未知  点击次数: 

在项目开发过程中经常会遇到数组中包含很多重复的内容,即脏数据去脏的操作,本文着重讲解了数组去重的几种方法。

1.根据js对象中key不重复的原则,构思出数组去重的方法,按照最常规的思维如下:

function distinctArray(arr) {

竟然还是一样的结果,这就并非我们想要的了,我们需要的结果应该是[1,2,3,"2"].即去重的过 程中需要保证数据类型的完整性。

针对以上情况,我们对上述方法进行改进:

var obj = {}, temp = [];
        for (var i = 0; i < arr.length; i++) {
                if (!obj[typeof(arr) + arr]) {
                        temp.push(arr);
                        obj[typeof(arr) + arr] = true;
                }
        }
        return temp;
}
// 以上方法在向对象中放key的时候加了typeof的前缀,那么让我们看看效果吧。
var testarr1 = [1, 2, 3, "2"];
console.log(distinctArray(testarr));// [1,2,3,"2"]
// 哎呦,不错哦!那么是不是这个函数就彻底ok呢,让我们再看一种情况!
var testarr1 = [1, 2, 3, "2", {a : 1}, {b : 1}];
console.log(distinctArray(testarr));// [1,2,3,"2",{a:1}]

竟然出现这个结果,怎么把{b:1}给莫名其妙的删掉了呢,去重的过程中如果出现误删除有用的数据可是很严重的问题,所以以上方法也不是perfect的一种,那就让我们接着往下看吧。


2.以上编码过程中我们的主要思想是利用js对象中key不重复的理念来指导我们的思维,但是最终没有解决所有的问题,那么接着我们可以考虑换一种思维模式来实现我们想要的功能。

用slice和splice方法来实现数组的去重,如下:

function distinctArray2(arr) {

测试结果仍然不能满足我们的需求,肿么办?经过我们队以上方法的研究,我们发现主要的问题出在比较两个对象相等的操作上,distinctArray2中利用”==“来比较,并不能区分大对象的内容是否相等,鉴于此种情况,我们另外写了一个方法:

function distinctArrayAll(arr) {

哎呀,终于顺利完成去重的任务了,至于每个方法的性能问题,我们留待下一次讨论!我们可以看出最后一种方法是万能去重法,可以针对复杂数组来去重,但是相应的执行开销也是相当大的,在实际的项目开发中有时我们需要的可能仅仅是纯数字或者纯字符串的去重,这就要求我们根据需求灵活选用相应的算法,在满足需求的基础上使程序效率更高!

(责任编辑:IT教学网)

更多

推荐Javascript/Ajax文章