数组去重

 js 群中有人问数组如何去重,激发一阵热烈讨论。

如果是在 powershell 中,那就简单了,直接调用 get-unique 方法即可。

在 js 中,又如何来处理数组去重呢?

下面谈谈我对此问题的理解。

---------------------------------------------

一种思路是利用数组的 indexOf 方法(用 lastindexOf 应该也可以),此方法会检测传入 indexOf 方法中的值,是否在数组中出现过,如未找到,是返回值 -1 ,由此来判断。

        var arr = [0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1];
        var arr1 = ["red", "green", "blue", "red", "purple", "maroon", "green", "yellow", "blue","red"];
        //利用数组的indexOf方法
        function getUnique(arr) {
            //用数组字面量声明一个空数组,将作为去重后的结果返回
            var result = [];

            //利用for遍历传入的测试数组,检测数组中的每个值是否已出现在结果数组中
            //返回 -1 ,则表明无,随即调用数组的 push 方法把此值压入结果数组中
            for (var i = 0; i < arr.length; i += 1) {
                if (result.indexOf(arr[i]) == -1) {
                    result.push(arr[i]);
                }
            }
            return result;
        }

        alert(getUnique(arr));
        alert(getUnique(arr1));

---------------------

另一思路,则是利用对象特性辅助去重

        //借助 js 对象特性为辅助去重
        
        function getUniquer1(arr) {
            //用数组字面量声明一个空数组,将作为去重后的结果返回
            var result = [];

            //用对象字面量声明一个空对象,作为辅助判断当前数组值是否为重复
            var aux = {};

            for (var i = 0; i < arr.length; i += 1) {
                if (!aux[arr[i]]) {     //最关键!判断对象中名为 arr[i] 的属性值是否为 false!
                    result.push(arr[i]);   //调用push方法,把值压入结果数组中
                    aux[arr[i]] = 1;     //重要!给对象中名为 arr[i]的属性赋值!
                }
            }
            return result;
        }

        alert(getUniquer1(arr));
        alert(getUniquer1(arr1));

 --------------------------------------------------------华丽的分割线--------------------------------------------

两种思路,高下立判:

前者调用 indexOf 方法,每次均需遍历整个数组,设想下,数组中有 10000 项,所耗费时间之大,不可想象。

 

posted @ 2016-12-13 16:25  sx00xs  阅读(433)  评论(0编辑  收藏  举报