Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按子字符串对表排序_Javascript_Html_Sorting_Substring - Fatal编程技术网

Javascript 按子字符串对表排序

Javascript 按子字符串对表排序,javascript,html,sorting,substring,Javascript,Html,Sorting,Substring,我试图按课程编号对表进行排序,但我需要使用子字符串按编号进行排序。课程名称看起来像CX-001,例如,我想忽略前三个字符。我使用的是香草Javascript。我不确定在哪里应用子字符串,但我知道我搞错了 函数sortSubNum(subNum){ var开关计数=0; var table=document.getElementById(“myTable2”).substring(2); 无功切换=真; //将排序方向设置为升序: var dir=“asc”; /*做一个循环,循环将持续到 未进

我试图按课程编号对表进行排序,但我需要使用子字符串按编号进行排序。课程名称看起来像CX-001,例如,我想忽略前三个字符。我使用的是香草Javascript。我不确定在哪里应用子字符串,但我知道我搞错了

函数sortSubNum(subNum){
var开关计数=0;
var table=document.getElementById(“myTable2”).substring(2);
无功切换=真;
//将排序方向设置为升序:
var dir=“asc”;
/*做一个循环,循环将持续到
未进行任何切换:*/
while(切换){
切换=错误;
var rows=table.rows;
无功开关;
对于(变量i=1;i<(rows.length-1);i++){
var x=行[i].getElementsByTagName(“TD”)[subNum];
var y=rows[i+1].getElementsByTagName(“TD”)[subNum];
//var resX=x.子串(2);
//var resY=y.子串(2);
如果(目录==“asc”){
if(Number(x.textContent.substring(2))Number(y.textContent.substring(2))){
shouldSwitch=true;
打破
}
}
}
如果(应切换){
行[i].parentNode.insertBefore(行[i+1],行[i]);
切换=真;
switchcount++;
}否则{
if(switchcount==0&&dir==“asc”){
dir=“desc”;
切换=真;
}
}
}
}
绿僵菌(1)

老师
课程号
史密斯
CS-301
凯莉
CX-201
公园
CS-001

已从var表中删除子字符串。此外,我还将for循环中的条件从

if (Number(x.textContent.substring(2)) < Number(y.textContent.substring(2)))
if(Number(x.textContent.substring(2))

if(x.textContent.substring(2)

函数sortSubNum(subNum){
var开关计数=0;
var table=document.getElementById(“myTable2”);
无功切换=真;
//将排序方向设置为升序:
var dir=“asc”;
/*做一个循环,循环将持续到
未进行任何切换:*/
while(切换){
切换=错误;
var rows=table.rows;
无功开关;
对于(变量i=1;i<(rows.length-1);i++){
var x=行[i].getElementsByTagName(“TD”)[subNum];
var y=rows[i+1].getElementsByTagName(“TD”)[subNum];
//var resX=x.子串(2);
//var resY=y.子串(2);
如果(目录==“asc”){
if(x.textContent.substring(2)y.textContent.substring(2)){
shouldSwitch=true;
打破
}
}
}
如果(应切换){
行[i].parentNode.insertBefore(行[i+1],行[i]);
切换=真;
switchcount++;
}否则{
if(switchcount==0&&dir==“asc”){
dir=“desc”;
切换=真;
}
}
}
}

虽然您已经在代码中发现了问题,但我的解决方案是基于@Patrick Roberts在评论中给出的建议


< >不要直接在DOM上实现您自己的排序方法,请考虑初始化元素数组并调用数组.Trime.SoSt*(),然后将新排序的元素重新插入表中。它会更快,更不容易出错

功能可排序(tbody、col、asc){
var rows=tbody.rows;
var rowsLen=tbody.rows.length;
var arr=新数组();
变量i,j,细胞,细胞;
//用表中的值填充数组
对于(i=0;ibCol)?asc:-1*asc);
});
对于(i=0;i
老师
课程号
史密斯
CS-301
凯莉
CX-201
公园
CS-001

使用
数组检查此解决方案。排序

var tbody=document.querySelector(“#myTable2 tbody”)
var trs=tbody.querySelectorAll('tr')
变量排序=[…trs]。排序((tra,trb)=>{
var courseA=tra.querySelectorAll('td')[1]。innerText
var courseB=trb.querySelectorAll('td')[1]。innerText
返回courseA.split('-')[1]-courseB.split('-')[1]
})
tbody.innerHTML='';
sorted.forEach(tr=>tbody.appendChild(tr))

老师
课程号
史密斯
CS-301
凯莉
CX-201
公园
CS-001

不要直接在DOM上实现您自己的排序方法,请考虑初始化一个元素和
if(x.textContent.substring(2) < y.textContent.substring(2))
function sortSubNum(subNum) {
    var switchcount = 0;

    var table = document.getElementById("myTable2");
    var switching = true;
    // Set the sorting direction to ascending:
    var dir = "asc"; 
    /* Make a loop that will continue until
    no switching has been done: */
    while(switching){
        switching = false;
        var rows = table.rows;
        var shouldSwitch;
        for(var i = 1; i < (rows.length - 1); i ++){

            var x = rows[i].getElementsByTagName("TD")[subNum];
            var y = rows[i + 1].getElementsByTagName("TD")[subNum];
            //var resX = x.substring(2);
            //var resY = y.substring(2);

            if(dir === "asc"){
                if(x.textContent.substring(2) < y.textContent.substring(2)) {
                    //if so, mark as a switch and break the loop:
                    shouldSwitch = true;
                    break;
                }
            }else if(dir === "desc"){
                if(x.textContent.substring(2) > y.textContent.substring(2)){
                    shouldSwitch = true;
                    break;
                }
            }
        }
        if(shouldSwitch){
            rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
            switching = true;
            switchcount++;
        }else{
            if (switchcount === 0 && dir === "asc") {
                dir = "desc";
                switching = true;
            }
        }
    }
}