今天五一,在出去玩之前趕緊寫篇博客,時刻不要忘記學習^_^!!
提到數組去重,想必大家都不陌生,會的同學可能噼里啪啦寫出好幾個,下面來看看之前常見的去重代碼:
'use strict'; var arr = [1,'a',undefined,null,NaN,1,'a',undefined,null,NaN]; Array.prototype.remDub = Array.prototype.remDub || function(){ this.sort(); var arr = [this[0]]; var bOk = true; for(var i = 1; i<this.length;i++){ if(this[i] !== arr[arr.length-1]){ arr.push(this[i]); } } return arr; }; console.log(arr.remDub()); // [ 1, NaN, NaN, 'a', null, undefined ]
上面這種是網上最常見的去重,看起來還行,就是沒有把NaN給去除,湊合能用。。。有的同學肯定會說那怎么行,咋們干程序是個嚴謹的事,一定要追求完美,
那有什么辦法可以辦法可以解決呢??其實是有的。。。我們可以借助json這種數據結構來實現,下面請看代碼:
'use strict'; var arr = [1,'a',undefined,null,NaN,1,'a',undefined,null,NaN]; Array.prototype.remDub = Array.prototype.remDub || function(){ var json = {}; for(var i = 0; i<this.length; i++){ json[this[i]] || (json[this[i]] = this[i]); } var arr = []; for(var name in json){ arr.push(json[name]); } return arr; }; console.log(arr.remDub()); //[ 1, 'a', undefined, null, NaN ]
上面這種利用json可以實現,其實在es6沒出來前用這個是不錯,但是es6是未來發展趨勢,所以來看看es6時如何實現的吧:
'use strict'; let arr = [1,'a',undefined,null,NaN,1,'a',undefined,null,NaN]; Array.prototype.remDub = Array.prototype.remDub || function () { //return Array.from(new Set(this)); return [...new Set(this)]; }; console.log(arr.remDub()); //[ 1, 'a', undefined, null, NaN ]
沒錯,用es6區區幾行代碼就解決了去重,利用 Set的這種不重復的數據結構。Set內部判斷兩個值是否不同,使用的算法叫做"Same-value equality",它類似於精確相等運算符(===
),主要的區別是NaN等於自身,而精確相等運算符認為NaN不等於自身。
到了這里很多同學會說,現在好多瀏覽器都不支持es6語法,用了也等於白用,那么這里我就在在介紹個東西吧。它叫babel;
首先我們通過npm去安裝它
這樣我們全局都能使用babel這個命令了,當然你也可以在改文件根目錄下把它注入依賴
然后在安裝一個babel-preset-es2015的模塊
然后在根目錄下配置個.babelrc的文件,在里面配置方法
沒錯,這就是剛才我們安裝的第二個模塊,我們告訴babel用es2015去轉換;
萬事俱備,只欠一行命令了,接下來我們在命令行輸入:
removeDub.js就是剛才es6語法的js文件,babel轉換后輸出es5語法的js文件。
轉換前:
轉換后: