有一哥们在微信开发中,到生成签名这抓狂了一天
最后发现微信调试工具在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;
}
}
嗯,输出终于正常了。碎觉碎觉。