Iterate over table cells, re-using rowspan values

html, html-table, javascript

Solution

Try this:

    <table id="tbl">
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td colspan="2" rowspan="2">A</td>
        <td rowspan="2">C</td>
    </tr>
    <tr>
        <td rowspan="2">E</td>
    </tr>
    <tr>
        <td>F</td>
        <td>G</td>
    </tr>
    </table>

Script:

    var finalResult = '';
    var totalTds = $('#tbl TR')[0].length;
    var trArray = [];
    var trArrayValue = [];
    var trIndex = 1;
    $('#tbl TR').each(function(){
    var currentTr = $(this);
    var tdIndex = 1;
    trArray[trIndex] = [];
    trArrayValue[trIndex] = [];
    var tdActuallyTraversed = 0;
    var colspanCount = 1;
    $('#tbl TR').first().children().each(function(){
        if(trIndex > 1 && trArray[trIndex - 1][tdIndex] > 1)
        { 
            trArray[trIndex][tdIndex] = trArray[trIndex - 1][tdIndex] - 1;
            trArrayValue[trIndex][tdIndex] = trArrayValue[trIndex - 1][tdIndex];
            finalResult = finalResult + trArrayValue[trIndex][tdIndex];
        }
        else
        {                        
            if(colspanCount <= 1)
            {
                colspanCount = currentTr.children().eq(tdActuallyTraversed).attr('colspan') != undefined ? currentTr.children().eq(tdActuallyTraversed).attr('colspan') : 1;
            }
            if(colspanCount > 1 && tdIndex > 1)
            {
                trArray[trIndex][tdIndex] = currentTr.children().eq(tdActuallyTraversed + colspanCount).attr('rowspan') != undefined ?currentTr.children().eq(tdActuallyTraversed + colspanCount).attr('rowspan') : 1;
                trArrayValue[trIndex][tdIndex] = trArrayValue[trIndex][tdIndex - 1];
                colspanCount--;
            }
            else
            {
                trArray[trIndex][tdIndex] = currentTr.children().eq(tdActuallyTraversed).attr('rowspan') != undefined ?currentTr.children().eq(tdActuallyTraversed).attr('rowspan') : 1;
                trArrayValue[trIndex][tdIndex] = currentTr.children().eq(tdActuallyTraversed).html();
                tdActuallyTraversed++;
            }
            finalResult = finalResult + trArrayValue[trIndex][tdIndex];

        }

        tdIndex++;
    });
    trIndex++;
});

alert(finalResult);

Fiddle

i am not sure about the performance, but it works well.

Problem

I have a simple HTML table, which uses rowspans in some random columns. An example might look like ``` A | B | ---|---| C D | | ---| E |--- F | | G ``` I'd like to iterate over the rows such that I see rows as `A,B,C`, `D,E,C`, then `F,E,G`. I think I can probably cobble together something very convoluted using `cell.index()` to check for "missed" columns in later rows, but I'd like something a little more elegant...

Original source

Related problems