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; } }
嗯,输出终于正常了。碎觉碎觉。