Javascript: сортировка объектов - PullRequest
1 голос
/ 21 июня 2011

Я ищу несколько идей о том, как этого добиться, когда я бью по стене.

У меня есть таблица, которая отображает данные, извлеченные из базы данных MySQL. Таблица представляет собой последовательность из 13 ячеек с отображаемыми данными, за которыми следует скрытая строка из одной ячейки. Скрытая строка переключается нажатием на ссылку в индексе ячейки 1 предыдущей строки. Вот так:

строка 1: щелкните эту ячейку, чтобы отобразить строку 2: еще одну ячейку: еще одну ячейку: до тошноты, пока мы не достигнем 13: строка 2, которая скрыта строка 3: щелкните эту ячейку, чтобы отобразить строку 2: еще одна ячейка: еще одна ячейка: до тошноты, пока мы не достигнем 13: строка 4, которая скрыта ...

поэтому, используя jquery, я вытащил все строки, а затем установил тест, чтобы определить, была ли это отображаемая строка или скрытая строка, если она отображалась, тогда я поместил эту и следующую строки в объект, а затем поместил этот объект в другой объект, например, так:

//this function is for sorting the data in the table
$(".sort").click(function() { 

        //get what column we are sorting by
        var sortBy = $(this).attr('sortBy');

        //set the colnum to sort by 
        if (sortBy == "itemname") { 
            var sortCol = 1;
        } else if (sortBy == "priority") { 
            var sortCol = 2;
        } else if (sortBy == "livedate") { 
            var sortCol = 10;
        } else if (sortBy == "status") { 
            var sortCol = 11;
        } else if (sortBy == "designer") { 
            var sortCol = 12;
        } 

        //get the table data
        var tableData = getTableData("NO", "null", "YES", sortBy); 

        //get all the rows
        var tableRowArray = $("#productTableBody tr");

        //declare new table object
        var tableObj = new Object;
        var rowPackage = new Object;

        //loop through tableRowArray and put rows into packages of two, the main row and the hidden row
        for(var t=0; t<tableRowArray.length; t++) { 
            if($(tableRowArray[t]).children(":first").attr('class') == "colorCode") { 

                rowPackage[t] = $(tableRowArray[t]).children();
                rowPackage[t+1] = $(tableRowArray[t+1]).children();

                //dump rows into tableObj
                tableObj[t] = rowPackage;
            }

            //clean out rowPackage
            rowPackage = {};
        }


        var x=-2;
        for(thisRow in tableObj) {
            x = x+2;
            var sortItem = $(tableObj[thisRow][x][sortCol]).html();

                            //ack! -->getting stumped here

        }       
    });

Я также собрал столбец, по которому пользователь хочет отсортировать. Затем я могу найти ячейку, по которой пользователь хочет отсортировать. Я знаю, что мне нужно вытащить эту информацию, поместить в массив и отсортировать, но я думаю, что я озадачен тем, как применить отсортированный массив обратно к своему tableObj, чтобы я мог переписать тело таблицы HTML ... причина, по которой я озадачен является то, что некоторые из данных, которые будут отсортированы, будут идентичны, например, если сортировка по конструктору, данные могут быть этим {"a", "b", "c", "c", "a", "a", " «a»}, который при сортировке будет a, a, a, a, b, c, c, но поскольку некоторые из них идентичны, я не могу вернуться назад и перебрать объект и найти запись, которая соответствует первому элементу в мой отсортированный массив, 4 элемента будут соответствовать ему. Так как мне определить, какая запись в объекте соответствует первой позиции в отсортированном списке?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Это сложный вопрос, но я полагаю, что в этой жизни нет ничего невозможного.

Я бы пошел так (используя Подчеркнуть библиотеку )

var packs = [];
// assuming you always have even number of tr's
$("#productTableBody tr:odd").each(function(i, tr){
    packs.push( {main: tr, sub: tr.next()} ); 
    // tr.next() will be :even, so it's not yet selected

    // now detach rows from the table
    // note the order - next() wont work otherwise
    tr.next().remove();
    tr.remove();
});

var sortedPacks = _(packs).sortBy(function(pack){
    return $(pack.main).find('td:nth('+sortCol')').text();
});

// now in sortedPacks you have touples of rows sorted by "main" rows sortCol column
// and you would probably want to restore the table now
$.each(packs, function(i, pack){
    $("#productTableBody").append(pack.main).append(pack.sub);
});

Код может не полностью отражать вашу ситуацию, но я полагаю, вы должны понять основную идею.

0 голосов
/ 21 июня 2011

Не очень легко получить то, что вы просите здесь, но это по крайней мере позволит вам отсортировать данные.

Начните с сбора данных в массив, например, data, каждая строка может быть представлена ​​либо массивом, либо объектом.

Теперь просто позвоните

data.sort(function(a, b){
     // select the two values from a and b depending on the column to sort by
     a = a[colNr];
     b = b[colNr];
     return a == b ? 0 : a < b ? -1 : 1;
 });

Теперь вы можете легко перестроить свою таблицу на основе отсортированного массива.

Если во время сбора данных вы также добавили ссылку на строку в массив / объект, то теперь вы можете удалить все строки из таблицы, выполнить цикл по массиву data и добавить каждый узел обратно в таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...