当前位置: 首页 > 图文教程 > 网络编程 > Javascript > Javascript 更新 JavaScript 数组的 uniq 方法

Javascript
JavaScript 渐变效果页面图片控制
JavaScript blog式日历控件新算法
Javascript 读后台cookie代码
js 弹簧效果代码
JavaScript滑移效果代码
javascript字符串拆分成单个字符相加和不超过10,求最终值
Prototype中dom对象方法汇总
Jquery与Prototype混合用法对比
javascript下IE与FF兼容函数收集
突破winxp sp2/win2003 sp2超强弹窗代码
js点击出现场层层外点击层消失的代码
Javascript模拟scroll滚动效果脚本
javascript各种复制代码收集
javascript的trim,ltrim,rtrim自定义函数
仿3721首页模块拖曳移动效果js代码[可拖曳层移动层]
Javascript拖拽系列文章1之offsetParent属性
Discuz! 6.1_jQuery兼容问题
js日历控件(可精确到分钟)
javascript DOM实用学习资料
javascript实现的树型下拉框改进版

Javascript 更新 JavaScript 数组的 uniq 方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 210 ::
收藏到网摘: n/a

上次写的一篇《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 方法,万分感谢。