返回信息流Array.prototype.single = function(){
var self = this;
var ca = this.concat().sort(); //这句什么意思?
ca.sort(function(a,b){
if(a == b){
self.reverse();
var n = self.indexOf(a);
self.splice(n,1);
self.reverse();
}
});
return self;
};
算法号称是o(1)的,没太看懂。明明是sort()方法,却没有执行冒泡排序。主要是标记的那行不明白。。
而且真的是o(1)吗?reverse()方法本身就不是o(1),如果不用那两行reverse()切下来的数组就乱序了。。
求解~
这是一条镜像帖。来源:北邮人论坛 / www-technology / #15664同步于 2012/3/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
JS简单的数组去重算法小问题
rhj1122
2012/3/16镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
concat返回副本 然后对副本sort一下 在对副本sort 在具体sort过程中 一旦发现有相同的项 就在原来的数组中找到一个这个相同项 然后删掉一个 还没看明白两次self.reverse(); 是干嘛的
【 在 seaver 的大作中提到: 】
: concat返回副本 然后对副本sort一下 在对副本sort 在具体sort过程中 一旦发现有相同的项 就在原来的数组中找到一个这个相同项 然后删掉一个 还没看明白两次self.reverse(); 是干嘛的
reverse()是数组逆序。
因为获取到的元素重复项是在前面,删除前面的重复项然后数组就....
比如吧,var a = new Array(1,2,3,1,4,5);
那执行a.single();之后返回的就是2,3,1,4,5
两个reverse();先把数组反过来从后面把重复项splice()掉。然后反回来。
最后返回1,2,3,4,5
不过......话说去重复到底是个什么标准,从前面删还是从后面删?
另外再问一下:this.concat().sort(); 创建副本那this.concat();不就好了,.sort()是干嘛?
而且既然有sort()就不应该是o(1)吧?