问题:请编一函数,实现将以下无规则的二维数组按指定列排序.
备注:如果某列全为数字就按数字排序,否则按字符串排序
var myArr=[[1,2,3,4,5],
[1.0,3,5,88,461,"x"],
[0.56,4568,"0.3"],
"0.5",
["xp","linux"],
"clip,dos,12px",
[3.2,0123,3.14,56],
2312,[0]];Array.prototype.order=function(nColumn,bDesc){
//nColumn按那一列排序,bDesc是否逆序
  var orderType=0;//0数字排序,1字符串排序
  for(var iLine in this)
  {//将二维数组的每一行都数组化
    if(typeof(this[iLine])=="number"){this[iLine]=[this[iLine]];}
    if(typeof(this[iLine])=="string"){this[iLine]=this[iLine].split(",");}
    if(typeof(this[iLine][nColumn])=="string"){orderType=1;}
  }
//***请你补全...
}myArr.order();//默认按首列顺排序
myArr.order(2,1);//指定按第三列逆排序
myArr.order(1);//指定按第二列顺排序

解决方案 »

  1.   

    作了个原型,
    可能有BUG,
    根据自己需求改改吧。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <script>
                function $(id){
                    return document.getElementById(id);
                }
                
                var myArr = [
    [2.1, 2, 3, 4, 5], 
    [1.0, 3, 5, 88, 461, "x"], 
    [0.56, 4568, "0.3"], 
    "0.5", 
    ["xp", "linux"], 
    "clip,dos,12px", 
    [3.2, 0123, 3.14, 56], 
    2312, 
    [0]
    ];
                
                // nColumn : 按那一列排序,bDesc是否逆序
                // bDesc   : true - 逆序, false 或者 null - 顺序
                Array.prototype.order = function(nColumn, bDesc){
                
                    // 设定默认参数
                    if (!nColumn) 
                        nColumn = 0;
                    
                    if (!bDesc) 
                        bDesc = false;
                    
                    //0数字排序,1字符串排序
    var orderType = 0;
                    for (var iLine in this) {//将二维数组的每一行都数组化
                        if (typeof(this[iLine]) == "number") {
                            this[iLine] = [this[iLine]];
                        }
                        if (typeof(this[iLine]) == "string") {
                            this[iLine] = this[iLine].split(",");
                        }
                        if (typeof(this[iLine][nColumn]) == "string") {
                            orderType = 1;
                        }
                    }
                    //***请你补全...
                    this.sort(function(a, b){
                        var ret;
                        if (a[nColumn]==null) {
                            return -1;
                        }
                        else 
                            if (b[nColumn]==null) {
                                return 1;
                            }
                            else {
                                if (orderType == 0) {
                                    ret = b[nColumn] - a[nColumn];
                                }
                                else {
                                    ret = b[nColumn].toString().localeCompare(a[nColumn].toString());
                                }
                            }                    return (ret * (bDesc ? 1 : -1));
                    });
                }

    //
                window.onload = function(){
                    $("div1").innerHTML += "<br>--myArr.order();--<br>";
                    myArr.order();//默认按首列顺排序
                    disp(myArr);                $("div1").innerHTML += "<br>-- myArr.order(2, 1); --<br>";
                    myArr.order(2, true);//指定按第三列逆排序
                    disp(myArr);                $("div1").innerHTML += "<br>-- myArr.order(1); --<br>";
                    myArr.order(1);//指定按第二列顺排序         
                    disp(myArr);
                }
                
                
                function disp(){
                    var str = "";
                    for (var i = 0; i < myArr.length; i++) {
                        str += myArr[i].join(",") + "<br>";
                    }
                    $("div1").innerHTML += str;
                }
            </script>
        </head>
        <body>
            <div id="div1">
            </div>
        </body>
    </html>