Javascript 更新 JavaScript 數(shù)組的 uniq 方法
更新時(shí)間:2008年01月23日 23:34:17 作者:
Javascript 更新 JavaScript 數(shù)組的 uniq 方法
上次寫的一篇《JavaScript 數(shù)組的 uniq 方法》,發(fā)現(xiàn)代碼的問題還是存在。比如如果數(shù)組內(nèi)有 undefined 元素就無法過濾等。
昨天看見 Lazy 兄弟重新更新了函數(shù),現(xiàn)在他是這樣子寫的:
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;
}按照他的說法:“這種解法在整個(gè)過程對(duì)原有數(shù)組的改變只有兩次,效率比其他兩種高了2個(gè)數(shù)量級(jí)左右!”,我實(shí)測了下此函數(shù)的效率,的確如此(測試連接點(diǎn)這里)。
我也重新編寫和更新了我的函數(shù),現(xiàn)在看起來是這個(gè)樣子的:
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;
}由同一個(gè)頁面測試所得,效率還是 Lazy 兄弟的稍許快些。經(jīng)過一點(diǎn)思考以后,我有了些一點(diǎn)點(diǎn)我的心得:
我的函數(shù) for 嵌套可以用一個(gè)函數(shù)獨(dú)立(就如 Lazy 兄弟的 include 函數(shù)一樣)。在上述的情況下,調(diào)用函數(shù)會(huì)比循環(huán)判斷效率要高一些。
數(shù)組的循環(huán)讀寫操作在數(shù)據(jù)量大的情況下應(yīng)格外的注意效率問題
Lazy 兄弟的結(jié)論:
對(duì)數(shù)組的改變開銷巨大,如果可能,盡量在不改變?cè)袛?shù)組的情況下進(jìn)行操作。
如最終需要改變數(shù)組自身,可將結(jié)果賦予原有數(shù)組來操作。另外,對(duì)于 length
的計(jì)算,似乎效率并未受其影響。Lazy 兄弟的 resultArr 數(shù)組按照他這樣的寫法就可以保存同樣的值,在這里贊一個(gè)(雖然我的函數(shù)經(jīng)過一點(diǎn)小的修改也可以實(shí)現(xiàn))。感興趣的朋友可以去 Lazy 的頁面去看看。
最后,推薦閱讀一下王元濤兄弟的 JavaScript 數(shù)組的 uniq 方法,萬分感謝。
昨天看見 Lazy 兄弟重新更新了函數(shù),現(xiàn)在他是這樣子寫的:
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;
}按照他的說法:“這種解法在整個(gè)過程對(duì)原有數(shù)組的改變只有兩次,效率比其他兩種高了2個(gè)數(shù)量級(jí)左右!”,我實(shí)測了下此函數(shù)的效率,的確如此(測試連接點(diǎn)這里)。
我也重新編寫和更新了我的函數(shù),現(xiàn)在看起來是這個(gè)樣子的:
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;
}由同一個(gè)頁面測試所得,效率還是 Lazy 兄弟的稍許快些。經(jīng)過一點(diǎn)思考以后,我有了些一點(diǎn)點(diǎn)我的心得:
我的函數(shù) for 嵌套可以用一個(gè)函數(shù)獨(dú)立(就如 Lazy 兄弟的 include 函數(shù)一樣)。在上述的情況下,調(diào)用函數(shù)會(huì)比循環(huán)判斷效率要高一些。
數(shù)組的循環(huán)讀寫操作在數(shù)據(jù)量大的情況下應(yīng)格外的注意效率問題
Lazy 兄弟的結(jié)論:
對(duì)數(shù)組的改變開銷巨大,如果可能,盡量在不改變?cè)袛?shù)組的情況下進(jìn)行操作。
如最終需要改變數(shù)組自身,可將結(jié)果賦予原有數(shù)組來操作。另外,對(duì)于 length
的計(jì)算,似乎效率并未受其影響。Lazy 兄弟的 resultArr 數(shù)組按照他這樣的寫法就可以保存同樣的值,在這里贊一個(gè)(雖然我的函數(shù)經(jīng)過一點(diǎn)小的修改也可以實(shí)現(xiàn))。感興趣的朋友可以去 Lazy 的頁面去看看。
最后,推薦閱讀一下王元濤兄弟的 JavaScript 數(shù)組的 uniq 方法,萬分感謝。
相關(guān)文章
js如何計(jì)算斐波那契數(shù)列第n項(xiàng)的值
這篇文章主要介紹了js如何計(jì)算斐波那契數(shù)列第n項(xiàng)的值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01JavaScript中關(guān)于字符串替換與截取的知識(shí)點(diǎn)匯總
在日常開發(fā)中,經(jīng)常遇到針對(duì)字符串的替換、截取,知識(shí)點(diǎn)比較碎容易混淆,所以本文為大家整理了一下相關(guān)的知識(shí)點(diǎn),希望對(duì)大家有所幫助2023-05-05使用javascript實(shí)現(xiàn)頁面定時(shí)跳轉(zhuǎn)總結(jié)篇
下面對(duì)使用JavaScript實(shí)現(xiàn)頁面定時(shí)跳轉(zhuǎn)做一下總結(jié),各種定時(shí)跳轉(zhuǎn)代碼記錄如下,希望對(duì)大家有所幫助2013-09-09JS實(shí)現(xiàn)的數(shù)組去除重復(fù)數(shù)據(jù)算法小結(jié)
這篇文章主要介紹了JS實(shí)現(xiàn)的數(shù)組去除重復(fù)數(shù)據(jù)算法,總結(jié)分析了4種比較常見的數(shù)組去重復(fù)算法及相關(guān)使用技巧,需要的朋友可以參考下2017-11-11javascript精確統(tǒng)計(jì)網(wǎng)站訪問量實(shí)例代碼
網(wǎng)站一般都有訪問量統(tǒng)計(jì)工具,比較高效實(shí)用的工具多種多樣,這篇文章主要介紹了javascript精確統(tǒng)計(jì)網(wǎng)站訪問量實(shí)例代碼,感興趣的小伙伴們可以參考一下2015-12-12淺析document.createDocumentFragment()與js效率
對(duì)于循環(huán)批量操作頁面的DOM有很大幫助!利用文檔碎片處理,然后一次性append,并且使用原生的javascript語句操作2013-07-07