前幾天碰到一個題目,要求是這樣的.javascript
爲 Array 對象添加一個去除重複項的方法java
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
es6
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
數組
它的在線編輯器只支持es5, 因此寫下了一長串代碼編輯器
Array.prototype.uniq = function () { var i = this.length - 1; for ( ; i >= 0; i--) { for (var j = i - 1; j >= 0; j--) { if (this[i] === this[j]) { this.splice(i, 1); break; } var isNumber = typeof this[i] === 'number' && typeof this[j] === 'number'; // 判斷二者是否都是NaN if (isNumber && isNaN(this[i]) && isNaN(this[j])) { this.splice(i, 1); break; } } } return this; }
兩個for循環, 時間複雜度就是 O(n**2) 。this
Array.prototype.uniq = function() { return [...new Set(this)]; }
啊, 這就完了? 沒錯, 這就完了。解釋下上面的代碼, Set是es6裏面的新對象, 有點雷係數組,可是它的沒有重複的值, 數組擴展運算符 [...array], 這裏的array能夠是數組也能夠是類數組對象, 做用就是把array的每一項提取出來做爲新數組的一項。es5
上面的代碼不會改變原數組, 若是要改變原數組, 能夠修改以下prototype
Array.prototype.uniq = function() { const arr = [...new Set(this)]; this.splice(0, this.length, ...arr); return arr; }