Javascript 更新 JavaScript 數組的 uniq 方法

來源:互聯網
上載者:User


上次寫的一篇《JavaScript 數組的 uniq 方法》,發現代碼的問題還是存在。比如如果數組內有 undefined 元素就無法過濾等。

昨天看見 Lazy 兄弟重新更新了函數,現在他是這樣子寫的:

Array.prototype.uniq = function() {
var resultArr = [],
returnArr = [],
origLen = this.length,
resultLen;

function include(arr, value) {
for (var i = 0, n = arr.length; i < n; ++i){
if (arr[i] === value) {
return true;
}
}

return false;
}

resultArr.push(this[0]);
for (var i = 1; i < origLen; ++i) {
if (include(resultArr, this[i])) {
returnArr.push(this[i]);
} else {
resultArr.push(this[i]);
}
}

resultLen = resultArr.length;
this.length = resultLen;
for (var i = 0; i < resultLen; ++i){
this[i] = resultArr[i];
}

return returnArr;
}按照他的說法:“這種解法在整個過程對原有數組的改變只有兩次,效率比其他兩種高了2個數量級左右!”,我實測了下此函數的效率,的確如此(測試連接點這裡)。

我也重新編寫和更新了我的函數,現在看起來是這個樣子的:

Array.prototype.uniq = function() {
var tmp = new Array;
var length = this.length;

for(var i = 0; i < length; i++) {
var push = true;
for(var j = i + 1; j < length; j++) {
if(this[j] === this[i]) {
push = false;
break;
}
}

if(push) {
tmp.push(this[i])
}
}

this.length = tmp.length;
for (var i = 0; i < tmp.length; i++) {
this[i] = tmp[i];
}

return tmp;
}由同一個頁面測試所得,效率還是 Lazy 兄弟的稍許快些。經過一點思考以後,我有了些一點點我的心得:

我的函數 for 嵌套可以用一個函數獨立(就如 Lazy 兄弟的 include 函數一樣)。在上述的情況下,調用函數會比迴圈判斷效率要高一些。
數組的迴圈讀寫操作在資料量大的情況下應格外的注意效率問題
Lazy 兄弟的結論:

對數組的改變開銷巨大,如果可能,盡量在不改變原有數組的情況下進行操作。
如最終需要改變數組自身,可將結果賦予原有數組來操作。另外,對於 length
的計算,似乎效率並未受其影響。Lazy 兄弟的 resultArr 數組按照他這樣的寫法就可以儲存同樣的值,在這裡贊一個(雖然我的函數經過一點小的修改也可以實現)。感興趣的朋友可以去 Lazy 的頁面去看看。

最後,推薦閱讀一下王元濤兄弟的 JavaScript 數組的 uniq 方法,萬分感謝。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: