• 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;
    	 	}
    	 }
    

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

  • 相关阅读:
    操作系统---学习笔记00
    操作系统---学习笔记0
    2015/07/16入园啦!
    1-1 console的用法
    2.3 js基础--DOM
    1.2 js基础
    1.1 js基础
    信息收集(1)
    Android概述
    从一次失败的比赛经历引发的思考
  • 原文地址:https://www.cnblogs.com/blackice/p/5031539.html
Copyright © 2020-2023  润新知