作家
登录

Javascript 更新 JavaScript 数组的 uniq 方法

作者: 来源:www.28hudong.com 2013-03-30 03:10:01 阅读 我要评论

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

  推荐阅读

  javascript创建数组的最简代码

日一二三四五六'.split('') ['日','一','二','三','四','五','六'] Array('日','一','二','三','四','五','六') new Array('日','一','二','三','四','五','六') 这里是输入的代码内容 [Ctrl+A 全选>>>详细阅读


本文标题:Javascript 更新 JavaScript 数组的 uniq 方法

地址:http://www.17bianji.com/kaifa2/JS/29841.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)