js 陣列去重複--通用方法
阿新 • • 發佈:2019-01-26
js去重,下面這個程式碼,會有不可描述的bug,臥槽。MMP,我是沒搞懂,這個宣告個方法,怎麼還被jquery還是js的庫方法呼叫了。真實可怕。不要用這個了。不然你也會遇到不可描述的錯誤的。我弄明白了,再更新下文章。
不推薦使用的方法,如下:
Array.prototype.distinct = function (){ var arr = this, result = [], len = arr.length; for (var i = 0; i < len; i++) { var bool = arr.indexOf(arr[i],i+1); //從傳入引數的下一個索引值開始尋找是否存在重複 if(bool === -1){ result.push(arr[i]); } } return result; };
js去重,然後,不使用呢個Set的,這個跟瀏覽器的版本有關係,不實在,還是簡單點的好。
方法很簡單,可能你還會搜尋到很多種方法,但是,只要記住個簡單到就好了。
我這個地方留個筆記。方便下次使用到時候,直接來自己的文章找就好了。
雖然,上面的方法,在瀏覽器的console裡面測試都是OK的,我在程式碼裡面測試也是OK的,但是他確影響到了我的其他地方的程式碼。出了莫名其妙的bug。最後,各種debug,發現是我的這個方法是罪魁禍首。臥槽。還是用地下的這個吧。
推薦使用的方法,如下:
function myUnique(arr) { var obj = {}; return arr.filter(function(item, index, array){ return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true) }) }
現在分析一下,上面的不可描述的bug。
繼續在瀏覽器的console裡面除錯,我聲明瞭個數組,然後,數組裡面有2個值,在後面,使用for迴圈,來操作這個陣列。
可以看到,原來只有2個值的陣列,現在竟然迴圈了三個東西出來。
前2個結果還是預料之中的,但是最後一個,呵呵,臥槽,他怎麼會出現呢。這不我剛剛宣告的陣列嘛。
炸就炸在這了。
這個怎麼解釋呢?
這個去重的方法,實際上是給js的陣列Array這個東西,新添加了個屬性,就是咱的呢個方法名稱。然後,這個Array,陣列,就是個object like,裡面存的就是key 以及value,所以,在上面for迴圈的時候,輸出的就是index,以及index對應的值。
這個for迴圈的寫法,js是支援的,但是,咱給Array這個物件添加了個預設的屬性---咱呢個方法名稱。以及這個key對應的值,就是那個方法體了。這個新新增的屬性,預設是可以迴圈的。
綜上所述,咱還是不使用這個方法了吧。