锁定老帖子 主题:js 去除数据重复数据
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-29
------------- Array.prototype.distinct = function() { var ret = []; for (var i = 0; i < this.length; i++) { for (var j = i+1; j < this.length;) { if (this[i].id === this[j].id) { ret.push(this.splice(j, 1)[0]); } else { j++; } } } return ret; } 说明:此实例数组类型为 var values =new Object(); values.id= getValues[i].id; values.text= getValues[i].text; values.checked="1"; 所以:判断条件为 if (this[i].id === this[j].id) 如果数据类型为 var s = [1,2,3····n]; 则,修改为 if (this[i] === this[j]) 即可! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-11-29
最后修改:2011-11-29
性能太慢,应考虑采用类似java的Set结构来处理这个需求:
Array.prototype.distinct = function(field) { var set = {}, hasField = typeof(field)!='undefined'; for(var i=this.length-1; i>=0; i--){ var obj = this[i], cacheKey = hasField ? obj[field] : obj; if(cacheKey in set){ this.splice(i, 1); continue; }else{ set[cacheKey] = null; } } } //test var a = [{id:1, name:'aaa'}, {id:2, name:'bbb'}, {id:1, name:'ccc'}]; a.distinct('id'); var b = [1,2,3,'a','b',2,'b',3]; b.distinct(); console.debug(a); console.debug(b); |
|
返回顶楼 | |
发表时间:2011-11-30
谈性能,你又弄错了吧,js是在客户端算的,就这点计算量 肯定比服务器端好!算法有待优化
|
|
返回顶楼 | |
发表时间:2011-11-30
var b = [2,'2'];
b.distinct(); 都没有对类型做检查,不同的类型也被去除了! |
|
返回顶楼 | |
发表时间:2011-12-03
foot3188 写道 var b = [2,'2'];
b.distinct(); 都没有对类型做检查,不同的类型也被去除了! 这位只看代码,不看说明的. 代码里用了 === 已经排除了不同类型的了. 只是说明比较的是元素的id属性,对于数字和字符串,就要把 id属性去掉了. 否则 undefined===undefined 当然是成立的. |
|
返回顶楼 | |
发表时间:2011-12-04
最后修改:2011-12-04
早就知道发帖会被各种或强或不强的人拍砖的,所以我一直都只是围观。哈哈
|
|
返回顶楼 | |
发表时间:2011-12-04
复杂度为数字的长度,咋样?
|
|
返回顶楼 | |
发表时间:2011-12-04
foot3188 写道 var b = [2,'2'];
b.distinct(); 都没有对类型做检查,不同的类型也被去除了! 为什么要在这里做类型检查?不同类型的数据出现在同一个列表中本身就是不正确的逻辑。 |
|
返回顶楼 | |
发表时间:2011-12-04
jyjava 写道 复杂度为数字的长度,咋样?
那完蛋了,这么多数据放在浏览器本地做,何必呢,为什么不放在服务端计算好? |
|
返回顶楼 | |
发表时间:2011-12-04
最后修改:2011-12-04
flyer646 写道 谈性能,你又弄错了吧,js是在客户端算的,就这点计算量 肯定比服务器端好!算法有待优化
小网站当然不用在意这点优化,如果你真的写过高交互的web app,你就不会这么认为了。 而且在写代码的时候时刻记得写出高性能的代码是每一个好的程序员应该做的。 |
|
返回顶楼 | |