IE数组排序问题的处理

有一哥们在微信开发中,到生成签名这抓狂了一天

 

最后发现微信调试工具在IE和chrome下对字符的排序竟然不同。

 

嗯,这个问题引起了我的关注,于是根据微信工具里的对象数组格式,撸了几句代码调试了一下,发现在IE9下,sort遇到复杂对象压根就不工作。

先来简单的:

     var k = ["a","A","123"];
     k.sort();
     console.log(k);

结果:123,A,a

元素是对象的:

var t = [];
var tmp = new Object();
tmp.id = "batch_add_api_ticket";
tmp.val = "A"
t.push(tmp);
tmp = new Object();
tmp.id = "timestamp";
tmp.val = "b"
t.push(tmp);
tmp = new Object();
tmp.id = "nonce_str1";
tmp.val = "12"
t.push(tmp);
tmp = new Object();
tmp.id = "card_id";
tmp.val = "d213"
t.push(tmp);

	t.sort(function(e,t){
		var bln = e.val>=t.val;
		console.log(e.val + ">=" + t.val + " is " + bln);
		return bln;
	});
	 var c="";
     for(i in t)c+=t[i].val;
     console.log(c);

IE9结果:Ab12d123

chrome结果:12Abd123

 

IE又增加了一个槽点,或许是有什么我等菜鸟不懂的玄鸡??

各种搜索无果,于是自己给Array增加一个冒泡排序(字典序)功能

 

Array.prototype.sort2 = function(fn){ 
	var fn = fn || function(a, b){ return a > b;}; 
	for(var i=0; i<this.length; i++){ 
		for(var j=i; j<this.length; j++){ 
			if(fn(this[i], this[j]) > 0){ 
				var t = this[i]; 
				this[i] = this[j]; 
				this[j] = t; 
			} 
		} 
	} 
	return this; 
}; 

经测IE和Chrome结果一致,打完收工碎觉。

 

等等,怎么有个undefined。。

仔细看看,原来拼接字符串时用了for in循环,for..in循环计数器是字符串,而不是for循环中的数字,它会把prototype中的方法或属性给遍历出来(好强大),于是,我们还要判断一下

	 for(var i in t){
	 	if(t.hasOwnProperty(i)){
	 		c+=t[i].val;
	 	}
	 }

嗯,输出终于正常了。碎觉碎觉。

posted @ 2015-12-09 00:16  黑冰.org  阅读(780)  评论(0编辑  收藏  举报