您好,欢迎访问一九零五行业门户网

Javascript 更新 JavaScript 数组的 uniq 方法_javascript技巧

上次写的一篇《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             if (arr[i] === value) {
                return true;
            }
        }
return false;
    }
resultarr.push(this[0]);
    for (var i = 1; 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         this[i] = resultarr[i];
    }
return returnarr;
}按照他的说法:“这种解法在整个过程对原有数组的改变只有两次,效率比其他两种高了2个数量级左右!”,我实测了下此函数的效率,的确如此(测试连接点这里)。
我也重新编写和更新了我的函数,现在看起来是这个样子的:
array.prototype.uniq = function() {
    var tmp    = new array;
    var length = this.length;
for(var i = 0; i         var push = true;
        for(var j = i + 1; j             if(this[j] === this[i]) {
                push = false;
                break;
            }
        }
if(push) {
            tmp.push(this[i])
        }
    }
this.length = tmp.length;
    for (var i = 0; i         this[i] = tmp[i];
    }
return tmp;
}由同一个页面测试所得,效率还是 lazy 兄弟的稍许快些。经过一点思考以后,我有了些一点点我的心得:
我的函数 for 嵌套可以用一个函数独立(就如 lazy 兄弟的 include 函数一样)。在上述的情况下,调用函数会比循环判断效率要高一些。 
数组的循环读写操作在数据量大的情况下应格外的注意效率问题 
lazy 兄弟的结论:
对数组的改变开销巨大,如果可能,尽量在不改变原有数组的情况下进行操作。
如最终需要改变数组自身,可将结果赋予原有数组来操作。另外,对于 length
的计算,似乎效率并未受其影响。lazy 兄弟的 resultarr 数组按照他这样的写法就可以保存同样的值,在这里赞一个(虽然我的函数经过一点小的修改也可以实现)。感兴趣的朋友可以去 lazy 的页面去看看。
最后,推荐阅读一下王元涛兄弟的 javascript 数组的 uniq 方法,万分感谢。
其它类似信息

推荐信息