循环

时间:2016-05-06 18:54:15

标签: javascript sorting

我不完全确定我的问题在这里。我有以下排序过程,对“表”(不是实际的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切换回“阻止”时,行的显示顺序与预先排序的顺序相同。我错过了任何人都可以帮忙的事情吗?

2 个答案:

答案 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中的内容。)