Javascript 按子字符串对表排序
我试图按课程编号对表进行排序,但我需要使用子字符串按编号进行排序。课程名称看起来像CX-001,例如,我想忽略前三个字符。我使用的是香草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”; /*做一个循环,循环将持续到 未进
函数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;
}
}
}
}