數組去重的JavaScript實現

1.最簡方法

建立一個空的新數組,依次檢查舊數組的值是否存在於新數組中,若是不存在就push進去。主要用到數組的indexOf方法。數組

function arrUnique(arr){
                var newArr = [];
                for (i = 0; i < arr.length; i++){
                    if (newArr.indexOf(arr[i]) == -1){
                        newArr.push(arr[i]);
                    }
                }
                return newArr;
            }
            var arr = [1,2,3,4,5,3,2];
            console.log(arrUnique(arr));

2.對象屬性賦值1

經過將舊數組的值分別賦值給對象的屬性,因爲對象屬性賦值時舊屬性會被新的同名屬性覆蓋,因此保證了數組(屬性)的單一性,最後經過for in將這些屬性push到新數組中。數據結構

function arrUnique(arr){
            var obj = {};
            var newArr = [];
            arr.map(function(item){
                obj[item] = null;
            })
            for (var key in obj){
                newArr.push(Number(key));
            }
            return newArr;
        }
        var arr = [1,2,3,4,5,3,2];
        console.log(arrUnique(arr));

3 對象屬性賦值2

建立一個空數組和空對象,檢查舊數組的值是否做爲對象的屬性存在,若是不存在就給這個對象添加數組值屬性,屬性值爲1,而且把這個數組的值賦值給新數組。利用的原理仍是對象屬性值會被覆蓋,也就是說是惟一的。下標的引用要比用indexOf搜索數組快的多,因此該方法方法2快。此處的對象實際上是一個哈希表,雖然速度快不少,可是內存佔用較大,也就是以空間換時間。code

function arrUnique(arr){
            var newArr = [];
            var obj = {};
            for (var i = 0; i < arr.length; i++){
                if (!obj[arr[i]]){
                    newArr.push(arr[i]);
                    obj[arr[i]]=1;
                }
            }
            return newArr;
        }
        var arr = [1,2,3,4,5,3,2];
        console.log(arrUnique(arr));

4 先使用數組的sort方法排序,節省空間且速度較快

先對原數組排序,而後判斷數組元素是否在新數組的最後一位,若是不是就push進去。這種方法比單純循環要快不少,雖然沒有哈希表方式快,可是不佔用較大空間。對象

function arrUnique(arr){
                arr.sort();//快排
                var newArr = [];
                for(var i = 0; i < arr.length; i++){
                    if (arr[i] !== newArr[newArr.length - 1]){
                        newArr.push(arr[i]);
                    }
                }
                return newArr;
            }
            var arr = [1,2,3,4,5,3,2];
            console.log(arrUnique(arr));

5 來自評論區的善意

昨天發佈該文以後,今天收到評論區 亦秋 的反饋,給出了兩種很簡潔的ES6去重方式。
1)第一種方式是判斷數組中的第一索引號等於參數索引號,通常來講,若是數組元素重複,除第一個元素外,全部重複元素的索引和該元素對應的第一索引是不一樣的。該處第一索引是指自左向右搜索到的第一個元素的索引號。排序

[1,2,3,4,5,3,2].filter((value, index, array) => array.indexOf(value) === index)

2)經過ES6的Set數據結構,該結構相似於數組,可是不會出現重複元素,所以,只要基於原始數組建立Set結構,而後在數組內部展開就成了單一元素數組。索引

[...new Set([1,2,3,4,5,3,2])]
相關文章
相關標籤/搜索