我不完全确定我的问题在这里。我有以下排序过程,对“表”(不是实际的HTML表)进行排序:
function sortByName(tableBody) {
var projectList = [];
for (var i = 0; i < tableBody.length; i++) {
projectList.push(tableBody[i]);
}
console.log("about to enter");
//console.log(tableRows);
for(var i = 0; i < tableBody.length; i++){
var currentRow = tableBody[i];
if(currentRow.innerText !== null){
currentRow.style.display ="none";
}
}
projectList.sort(function(a,b){
var nameA = a.innerText.toUpperCase(); // ignore upper and lowercase
var nameB = b.innerText.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
});
console.log(projectList);
for(var q = 0; q < projectList.length; q++){
redisplayProjects(q, projectList);
}
}
function redisplayProjects(index, projectList){
console.log(projectList);
projectList[index].style.display = 'block';
}
显示到控制台,projectList实际上是在控制台中排序,但是在将style.display切换回“阻止”时,行的显示顺序与预先排序的顺序相同。我错过了任何人都可以帮忙的事情吗?
答案 0 :(得分:2)
假设 sortByName 函数参数tableBody
期望某个表的DOM Row集合, - 使用它。:
function sortByName( tableBody ) {
var i = 0, projectList = [].slice.call(tableBody).
sort( function( a, b ){
var A = a.innerText.toUpperCase(), B = b.innerText.toUpperCase();
return A < B ? -1 : A > B ? 1 : 0;
}), wrapper = tableBody[0].parentElement;
while( projectList[i] )wrapper.appendChild( projectList[i++] );
}
我还假设使用即时排序功能,你不需要切换元素的显示样式属性,因为它们将立即按各自的排序顺序放置!
问候。
p.s。:仍然不确定 tableBody 究竟是什么,因此根据对此信息的更新,给定的功能可能或可能不需要进一步调整。
答案 1 :(得分:1)
您使用tableBody
(无论是什么)中的元素创建了一个数组,然后在该数组中重新排列这些元素。但是你没有对tableBody
本身做任何更改,即使你有,也可能没有预期的结果(再次,不知道tableBody
中的内容。)