锁定老帖子 主题:js 去除数据重复数据
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-04
具体问题,具体分析。大家都想在各各方面取得最优的方案,但是并不能保证在实际应用中就是最佳的。
|
|
返回顶楼 | |
发表时间:2011-12-04
zuoming99 写道 flyer646 写道 谈性能,你又弄错了吧,js是在客户端算的,就这点计算量 肯定比服务器端好!算法有待优化
小网站当然不用在意这点优化,如果你真的写过高交互的web app,你就不会这么认为了。 而且在写代码的时候时刻记得写出高性能的代码是每一个好的程序员应该做的。 你的方法不错,测试了下。的确比我的要快。对于大量的数据可以反映出来这个差距,但是只要不上百基本延迟1-2S; 一个数组如果在js中存在,那就有问题了。你说是不? |
|
返回顶楼 | |
发表时间:2011-12-05
zuoming99 写道 foot3188 写道 var b = [2,'2'];
b.distinct(); 都没有对类型做检查,不同的类型也被去除了! 为什么要在这里做类型检查?不同类型的数据出现在同一个列表中本身就是不正确的逻辑。 前面自己举例 ,var b = [1,2,3,'a','b',2,'b',3]; 后面又说不同类型出现在一个列表中本身就是不正确的逻辑。。。 拜托发言前先看看自己说了什么。 再者目的是数组去重,数组里面连对象都可以有,为什么不能有数字和字符串?? 如果数据都是你规定好的,那又何必用程序去重呢?干脆手动把重复的干掉就行了 |
|
返回顶楼 | |
发表时间:2011-12-05
去除重复数据是建立在数据比较的基础上的,如果数组内的元素可以限定为同一类型,可以把比较器函数作为参数传入,即:
Array.prototype.distinct = function(comparator){...} 比较的时候基本类型之间比较直接取值,json对象之间比较调用comparator函数 我也觉得在数组中存入不同类型有点不好看,但是这种情况也是普遍存在,可否借鉴java的做法,比较不同类型的hashCode,当然首先得在Object范围内定义: Object.prototype.hashCode = function() {...} 我承认这是一个馊主意。 |
|
返回顶楼 | |
发表时间:2011-12-06
zuoming99 写道 flyer646 写道 谈性能,你又弄错了吧,js是在客户端算的,就这点计算量 肯定比服务器端好!算法有待优化
小网站当然不用在意这点优化,如果你真的写过高交互的web app,你就不会这么认为了。 而且在写代码的时候时刻记得写出高性能的代码是每一个好的程序员应该做的。 我很喜欢这种精神,也希望自己能够在日常的工作学习中厉行这种精神 |
|
返回顶楼 | |
发表时间:2011-12-07
确实效率不高啊,我写个以空间换时间的方法。
Array.prototype.distinct = function() { var set = {}; for(var i = 0; i < this.length; i++){ var item = this[i], key = item.id ? item.id : item.toString(); if(key in set && set[key] === item){ this.splice(i, 1); i--; continue; }else{ set[key] = item; } } } |
|
返回顶楼 | |
发表时间:2011-12-09
axiheyhey 写道 确实效率不高啊,我写个以空间换时间的方法。
Array.prototype.distinct = function() { var set = {}; for(var i = 0; i < this.length; i++){ var item = this[i], key = item.id ? item.id : item.toString(); if(key in set && set[key] === item){ this.splice(i, 1); i--; continue; }else{ set[key] = item; } } } 无效,还要实现toString()方法?那不是更慢咯? var a = [{name:'xxx'}, {name:'yyy'}, {name:'yyy'}]; a.distinct() |
|
返回顶楼 | |
发表时间:2011-12-09
foot3188 写道 zuoming99 写道 foot3188 写道 var b = [2,'2'];
b.distinct(); 都没有对类型做检查,不同的类型也被去除了! 为什么要在这里做类型检查?不同类型的数据出现在同一个列表中本身就是不正确的逻辑。 前面自己举例 ,var b = [1,2,3,'a','b',2,'b',3]; 后面又说不同类型出现在一个列表中本身就是不正确的逻辑。。。 拜托发言前先看看自己说了什么。 再者目的是数组去重,数组里面连对象都可以有,为什么不能有数字和字符串?? 如果数据都是你规定好的,那又何必用程序去重呢?干脆手动把重复的干掉就行了 我的描述和示例代码没有冲突,不同类型出现在一个列表中的确是不正确的逻辑。 示例代码写成var b = [1,2,3,'a','b',2,'b',3]只是说数据类型不同也应该去重。 好吧,我得承认我不喜欢抬杠。 |
|
返回顶楼 | |