Javascript 对多维数组进行排序不需要';不能用小数

Javascript 对多维数组进行排序不需要';不能用小数,javascript,arrays,sorting,Javascript,Arrays,Sorting,此问题与此问题相关,并基于此问题的脚本:。我的解决方案在当时起了作用(我相信是这样),但在对自定义标记进行了一系列更改以使其跨浏览器兼容之后,我现在遇到了一个新问题 我有下面的代码。我为时间的长度道歉;这是我在复制问题的同时所能简化的: <table border=1> <tr style="font-weight:bold;"> <td>Begin Text</td> <td>Begin Num

此问题与此问题相关,并基于此问题的脚本:。我的解决方案在当时起了作用(我相信是这样),但在对自定义标记进行了一系列更改以使其跨浏览器兼容之后,我现在遇到了一个新问题

我有下面的代码。我为时间的长度道歉;这是我在复制问题的同时所能简化的:

<table border=1>
    <tr style="font-weight:bold;">
        <td>Begin Text</td>
        <td>Begin Number</td>
        <td>Sorted Text</td>
        <td>Sorted Number</td>
    </tr>
    <tr>
        <td id="r1c1"></td>
        <td id="r1c2"></td>
        <td id="r1c3"></td>
        <td id="r1c4"></td>
    </tr>
    <tr>
        <td id="r2c1"></td>
        <td id="r2c2"></td>
        <td id="r2c3"></td>
        <td id="r2c4"></td>
    </tr>
    <tr>
        <td id="r3c1"></td>
        <td id="r3c2"></td>
        <td id="r3c3"></td>
        <td id="r3c4"></td>
    </tr>
    <tr>
        <td id="r4c1"></td>
        <td id="r4c2"></td>
        <td id="r4c3"></td>
        <td id="r4c4"></td>
    </tr>
    <tr>
        <td id="r5c1"></td>
        <td id="r5c2"></td>
        <td id="r5c3"></td>
        <td id="r5c4"></td>
    </tr>
    <tr>
        <td id="r6c1"></td>
        <td id="r6c2"></td>
        <td id="r6c3"></td>
        <td id="r6c4"></td>
    </tr>
    <tr>
        <td id="r7c1"></td>
        <td id="r7c2"></td>
        <td id="r7c3"></td>
        <td id="r7c4"></td>
    </tr>
    <tr>
        <td id="r8c1"></td>
        <td id="r8c2"></td>
        <td id="r8c3"></td>
        <td id="r8c4"></td>
    </tr>
    <tr>
        <td><input type="button" onclick="testSort(1);" value="Sort"></td>
        <td><input type="button" onclick="testSort(2);" value="Sort"></td>
    </tr>
</table>

<script>
    function testSort(orderCol) {
        orderList = [orderCol];
        dataArr = do2DArraySort(dataArr, orderList, 'desc');
        for (x=1; x<=numRows; x++) {
            document.getElementById('r' + x + 'c3').innerHTML = dataArr[x-1][1];
            document.getElementById('r' + x + 'c4').innerHTML = dataArr[x-1][2];
        }
    }

    function TwoDimensionalArray(iRows, iCols) { 
        var i;
        var j;
        var a = new Array(iRows);
        for (i=0; i < iRows; i++) {
            a[i] = new Array(iCols);
            for (j=0; j < iCols; j++) {
                a[i][j] = "";
            }
        }
        return(a);
    }

    function do2DArraySort(dataArr, orderList, orderDir) {
        //Loop over each item in the list of sort columns.  For each one invoke the sort method on the array using the appropriate function.
        for (x=orderList.length-1; x >= 0; x--) {
            if (orderDir[x] == 'asc') {
                dataArr.sort(sortMethodFunctionAsc);
            } else {
                dataArr.sort(sortMethodFunctionDesc);
            }
        }

        return dataArr;
    }

    function checkSortValues(a, b) {
        var dataType = 'Text';
        if ((IsNumeric(a) && IsNumeric(b)) || (a == null && IsNumeric(b)) || (IsNumeric(a) && b == null)) {
            dataType = 'Numeric';
        }
        if ((IsDate(a) && IsDate(b)) || (a == null && IsDate(b)) || (IsDate(a) && b == null)) {
            dataType = 'Date';
        }
        return dataType;
    }

    function sortMethodFunctionAsc(a, b) {
        if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Numeric') {
            //If the values are numeric, simply check which is larger than the other.
            return a[orderList[x]] - b[orderList[x]];
        } else if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Date') {
            //If the values are dates they need converted to date objects.  95% of the time this is not necessary as they are already passed in as dates,
            //but the conversion is required to catch the few cases when they are not.
            var a2 = new Date(a[orderList[x]]);
            var b2 = new Date(b[orderList[x]]);
            //The getTime method is used to convert the dates into millisecond ticker equivalents for easier comparison.
            return a2.getTime() - b2.getTime();
        } else {
            //If one of the values is a string, convert both to a string and compare alphabetically.
            if (a[orderList[x]].toString() > b[orderList[x]].toString()) {
                return 1;
            } else if (a[orderList[x]].toString() < b[orderList[x]].toString()) {
                return -1;
            } else {
                //If they are the same, tell the sort to skip them.
                return 0;
            }
        }
    }

    function sortMethodFunctionDesc(a, b) {
        //This function is identical to the ascending one, but the comparison operators are reversed.
        if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Numeric') {
            return b[orderList[x]] - a[orderList[x]];
        } else if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Date') {
            var a2 = new Date(a[orderList[x]]);
            var b2 = new Date(b[orderList[x]]);
            return b2.getTime() - a2.getTime();
        } else {
            if (a[orderList[x]].toString() < b[orderList[x]].toString()) {
                return 1;
            } else if (a[orderList[x]].toString() > b[orderList[x]].toString()) {
                return -1;
            } else {
                return 0;
            }
        }
    }

    function IsNumeric(input) {
        return (input - 0) == input && input.length > 0;
    }

    function IsDate(testValue) {
        var returnValue = false;
        var testDate;
        try {
            testDate = new Date(testValue);
            if (!isNaN(testDate)) {
                returnValue = true;
            } else {
                returnValue = false;
            }
        }
        catch (e) {
            returnValue = false;
        }
        return returnValue;
    }

    numRows = 8;
    orderList = [1];
    dataArr = TwoDimensionalArray(numRows, 2);

    dataArr[0][1] = 'Jimbo';
    dataArr[0][2] = 3;
    dataArr[1][1] = 'Jim';
    dataArr[1][2] = 0.65;
    dataArr[2][1] = 'Jackie';
    dataArr[2][2] = 1.25;
    dataArr[3][1] = 'John';
    dataArr[3][2] = 0.8;
    dataArr[4][1] = 'Jacob';
    dataArr[4][2] = 0.95;
    dataArr[5][1] = 'Jill';
    dataArr[5][2] = 0.85;
    dataArr[6][1] = 'Jan';
    dataArr[6][2] = 0.8;
    dataArr[7][1] = 'Jamie';
    dataArr[7][2] = 1.45;
    for (x=1; x<=numRows; x++) {
        document.getElementById('r' + x + 'c1').innerHTML = dataArr[x-1][1];
        document.getElementById('r' + x + 'c2').innerHTML = dataArr[x-1][2];
    }
</script>

开始文本
开始编号
排序文本
排序数
函数testSort(orderCol){
orderList=[orderCol];
dataArr=do2DArraySort(dataArr,orderList,'desc');
对于(x=1;x=0;x--){
if(orderDir[x]==“asc”){
dataArr.sort(sortMethodFunctionAsc);
}否则{
dataArr.sort(sortMethodFunctionDesc);
}
}
返回数据arr;
}
函数检查SORTVALUES(a,b){
var数据类型='Text';
if((IsNumeric(a)和&IsNumeric(b))| |(a==null和&IsNumeric(b))| |(IsNumeric(a)和&b==null)){
数据类型='Numeric';
}
如果((IsDate(a)和&IsDate(b))| |(a==null和&IsDate(b))|(IsDate(a)和&b==null)){
数据类型='日期';
}
返回数据类型;
}
函数排序方法函数ASC(a,b){
if(checkSortValues(a[orderList[x]],b[orderList[x]])=='Numeric'){
//如果这些值是数值,只需检查哪个比另一个大。
返回a[orderList[x]]-b[orderList[x]];
}else if(检查SORTVALUES(a[orderList[x]],b[orderList[x]])=='Date'){
//如果值是日期,则它们需要转换为日期对象。95%的时间不需要转换,因为它们已作为日期传入,
//但是,需要进行转换以捕获少数情况,而这些情况并非如此。
var a2=新日期(a[orderList[x]]);
var b2=新日期(b[订单列表[x]]);
//getTime方法用于将日期转换为毫秒的等价代码,以便于比较。
返回a2.getTime()-b2.getTime();
}否则{
//如果其中一个值是字符串,请将两者转换为字符串并按字母顺序进行比较。
如果(a[orderList[x]].toString()>b[orderList[x]].toString()){
返回1;
}else if(a[orderList[x]].toString()b[orderList[x]].toString()){
返回-1;
}否则{
返回0;
}
}
}
函数为数字(输入){
返回值(输入-0)=input&&input.length>0;
}
函数IsDate(testValue){
var returnValue=false;
var测试日期;
试一试{
testDate=新日期(testValue);
如果(!isNaN(测试日期)){
returnValue=true;
}否则{
returnValue=false;
}
}
捕获(e){
returnValue=false;
}
返回值;
}
numRows=8;
订单列表=[1];
数据阵列=二维阵列(numRows,2);
dataArr[0][1]=“Jimbo”;
dataArr[0][2]=3;
dataArr[1][1]=“Jim”;
dataArr[1][2]=0.65;
dataArr[2][1]=“Jackie”;
dataArr[2][2]=1.25;
dataArr[3][1]=“John”;
dataArr[3][2]=0.8;
dataArr[4][1]=“Jacob”;
dataArr[4][2]=0.95;
dataArr[5][1]=“吉尔”;
dataArr[5][2]=0.85;
dataArr[6][1]=“Jan”;
dataArr[6][2]=0.8;
dataArr[7][1]=“Jamie”;
dataArr[7][2]=1.45;

对于(x=1;x而言,
checkSortValues
函数中存在一个问题,即一旦数据类型设置为number,它也会对日期进行阳性测试

此外,您的IsNumeric测试中有一个错误,
input.length
将返回undefined。您应该注释掉/更改测试的第二部分

function IsNumeric(input) {
  return (input - 0) == input // && input.length > 0;
}
如果您更改了
IsNumeric
测试,并且在日期测试中使用
else If
而不是
If
,我认为这解决了您的问题

function checkSortValues(a, b) {
    var dataType = 'Text';
    if ((IsNumeric(a) && IsNumeric(b)) || (a == null && IsNumeric(b)) || (IsNumeric(a) && b == null)) {
        dataType = 'Numeric';
    }
    else if ((IsDate(a) && IsDate(b)) || (a == null && IsDate(b)) || (IsDate(a) && b == null)) {
        dataType = 'Date';
    }
    return dataType;
}
编辑:包括我建议修改的完整代码

我已经测试过了,它对我很有效,按照正确的顺序排序

<table border=1>
    <tr style="font-weight:bold;">
        <td>Begin Text</td>
        <td>Begin Number</td>
        <td>Sorted Text</td>
        <td>Sorted Number</td>
    </tr>
    <tr>
        <td id="r1c1"></td>
        <td id="r1c2"></td>
        <td id="r1c3"></td>
        <td id="r1c4"></td>
    </tr>
    <tr>
        <td id="r2c1"></td>
        <td id="r2c2"></td>
        <td id="r2c3"></td>
        <td id="r2c4"></td>
    </tr>
    <tr>
        <td id="r3c1"></td>
        <td id="r3c2"></td>
        <td id="r3c3"></td>
        <td id="r3c4"></td>
    </tr>
    <tr>
        <td id="r4c1"></td>
        <td id="r4c2"></td>
        <td id="r4c3"></td>
        <td id="r4c4"></td>
    </tr>
    <tr>
        <td id="r5c1"></td>
        <td id="r5c2"></td>
        <td id="r5c3"></td>
        <td id="r5c4"></td>
    </tr>
    <tr>
        <td id="r6c1"></td>
        <td id="r6c2"></td>
        <td id="r6c3"></td>
        <td id="r6c4"></td>
    </tr>
    <tr>
        <td id="r7c1"></td>
        <td id="r7c2"></td>
        <td id="r7c3"></td>
        <td id="r7c4"></td>
    </tr>
    <tr>
        <td id="r8c1"></td>
        <td id="r8c2"></td>
        <td id="r8c3"></td>
        <td id="r8c4"></td>
    </tr>
    <tr>
        <td><input type="button" onclick="testSort(1);" value="Sort"></td>
        <td><input type="button" onclick="testSort(2);" value="Sort"></td>
    </tr>
</table>

<script>
    function testSort(orderCol) {
        orderList = [orderCol];
        dataArr = do2DArraySort(dataArr, orderList, 'desc');
        for (x=1; x<=numRows; x++) {
            document.getElementById('r' + x + 'c3').innerHTML = dataArr[x-1][1];
            document.getElementById('r' + x + 'c4').innerHTML = dataArr[x-1][2];
        }
    }

    function TwoDimensionalArray(iRows, iCols) { 
        var i;
        var j;
        var a = new Array(iRows);
        for (i=0; i < iRows; i++) {
            a[i] = new Array(iCols);
            for (j=0; j < iCols; j++) {
                a[i][j] = "";
            }
        }
        return(a);
    }

    function do2DArraySort(dataArr, orderList, orderDir) {
        //Loop over each item in the list of sort columns.  For each one invoke the sort method on the array using the appropriate function.
        for (x=orderList.length-1; x >= 0; x--) {
            if (orderDir[x] == 'asc') {
                dataArr.sort(sortMethodFunctionAsc);
            } else {
                dataArr.sort(sortMethodFunctionDesc);
            }
        }

        return dataArr;
    }

    function checkSortValues(a, b) {
        var dataType = 'Text';
        if ((IsNumeric(a) && IsNumeric(b)) || (a == null && IsNumeric(b)) || (IsNumeric(a) && b == null)) {
            dataType = 'Numeric';
        }
        else if ((IsDate(a) && IsDate(b)) || (a == null && IsDate(b)) || (IsDate(a) && b == null)) {
            dataType = 'Date';
        }
        return dataType;
    }

    function sortMethodFunctionAsc(a, b) {
        if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Numeric') {
            //If the values are numeric, simply check which is larger than the other.
            return a[orderList[x]] - b[orderList[x]];
        } else if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Date') {
            //If the values are dates they need converted to date objects.  95% of the time this is not necessary as they are already passed in as dates,
            //but the conversion is required to catch the few cases when they are not.
            var a2 = new Date(a[orderList[x]]);
            var b2 = new Date(b[orderList[x]]);
            //The getTime method is used to convert the dates into millisecond ticker equivalents for easier comparison.
            return a2.getTime() - b2.getTime();
        } else {
            //If one of the values is a string, convert both to a string and compare alphabetically.
            if (a[orderList[x]].toString() > b[orderList[x]].toString()) {
                return 1;
            } else if (a[orderList[x]].toString() < b[orderList[x]].toString()) {
                return -1;
            } else {
                //If they are the same, tell the sort to skip them.
                return 0;
            }
        }
    }

    function sortMethodFunctionDesc(a, b) {
        //This function is identical to the ascending one, but the comparison operators are reversed.
        if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Numeric') {
            return b[orderList[x]] - a[orderList[x]];
        } else if (checkSortValues(a[orderList[x]], b[orderList[x]]) == 'Date') {
            var a2 = new Date(a[orderList[x]]);
            var b2 = new Date(b[orderList[x]]);
            return b2.getTime() - a2.getTime();
        } else {
            if (a[orderList[x]].toString() < b[orderList[x]].toString()) {
                return 1;
            } else if (a[orderList[x]].toString() > b[orderList[x]].toString()) {
                return -1;
            } else {
                return 0;
            }
        }
    }

    function IsNumeric(input) {
      return (input - 0) == input// && input.length > 0;
    }

    function IsDate(testValue) {
        var returnValue = false;
        var testDate;
        try {
            testDate = new Date(testValue);
            if (!isNaN(testDate)) {
                returnValue = true;
            } else {
                returnValue = false;
            }
        }
        catch (e) {
            returnValue = false;
        }
        return returnValue;
    }

    numRows = 8;
    orderList = [1];
    dataArr = TwoDimensionalArray(numRows, 2);

    dataArr[0][1] = 'Jimbo';
    dataArr[0][2] = 3;
    dataArr[1][1] = 'Jim';
    dataArr[1][2] = 0.65;
    dataArr[2][1] = 'Jackie';
    dataArr[2][2] = 1.25;
    dataArr[3][1] = 'John';
    dataArr[3][2] = 0.8;
    dataArr[4][1] = 'Jacob';
    dataArr[4][2] = 0.95;
    dataArr[5][1] = 'Jill';
    dataArr[5][2] = 0.85;
    dataArr[6][1] = 'Jan';
    dataArr[6][2] = 0.8;
    dataArr[7][1] = 'Jamie';
    dataArr[7][2] = 1.45;
    for (x=1; x<=numRows; x++) {
        document.getElementById('r' + x + 'c1').innerHTML = dataArr[x-1][1];
        document.getElementById('r' + x + 'c2').innerHTML = dataArr[x-1][2];
    }
</script>

开始文本
开始编号
排序文本
排序数
if (a < b) {
    return 1;
} else if (b > a) {
    return -1;
} else {
    return
}
function sortAsc() {
    ... // implement
}

function sortDesc(a, b) {
    return -1 * sortAsc(a,b);
}
var my_string = "foo";
var my_number = 42; // no quotes
var my_decimal = 0.63;
var date = new Date();
alert(date instanceof Date);    // should be true