從數組去重這個函數來體驗es6的高效率

前幾天碰到一個題目,要求是這樣的.javascript

題目描述

爲 Array 對象添加一個去除重複項的方法java

示例1

輸入

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]es6

輸出

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']數組

es5代碼

它的在線編輯器只支持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

es6代碼

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;
}
相關文章
相關標籤/搜索