Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > запись в нужную ячейку в таблице


Автор: dsy 27.3.2007, 17:04
Здрасьте всем!
Помогите, пожалуйста.
У меня есть таблица:

Код

<table>
<thead>
<tr>
<td>ФИО</td>
<td id="TabNum">Табельный номер</td>
<td id="personCount">Кол-во записей на сотрудника</td>
</tr>
</thead>
<tbody id="TBody">
<tr>
<td>Иванов И.И.</td>
<td>21</td>
<td>n/a</td>
</tr>
<tr>
<td>Петров П.П.</td>
<td>33</td>
<td>n/a</td>
</tr>
<tr>
<td>Иванов И.И.</td>
<td>21</td>
<td>n/a</td>
</tr>
</tdoby>
</table>


 и мне нужно пройтись по таблице, посчитать сколько раз встречается каждый человек и проставить в нужную ячейку (id="personCount")
это количество.
Попытался написать алгоритм. Конечно, он работает, т.к. писал интуитивно. Осталось разобраться с синтаксисом и правильно обратиться к свойствам ))
На JavaScript'e пишу очень редко, так что не судите строго.
Получилась примерно такая функция:
Код

//  Считает кол-во записей для каждого сотрудника и устанавливает его в соответствующую ячейку таблицы
function SetSubPeriodCountPerDriver(tabID, readCellID, writeCellID)
{
    var theTab = document.getElementById(tabID);      //getElementsByTagName('TR');
    var count = 0;
    val tdValue = null;
    for(var i=0; i<theTab.rows.length; i++)
    {
        tdValue = theTab[i].getElementById(readCellID).innerHTML;
        count = 1;
        for(var j=i+1; j<theTab.rows.length; j++)
        {
            if(theTab[i].getElementById(readCellID).innerHTML == tdValue)
                count++;
        }
        //  Записываем кол-во подпериодов в ячейку writeCellID
        for(var k=0; k<theTab.rows.length; k++)
        {
            if(theTab[k].getElementById(readCellID).innerHTML == tdValue)
                theTab[k].getElementById(writeCellID).innerHTML = count;
        }
    }    
}

Помогите, пожалуйста, исправить ошибки.
Заранее, благодарен.

Автор: vasac 27.3.2007, 17:53
Цитата(dsy @  27.3.2007,  17:04 Найти цитируемый пост)
tdValue = theTab[i].getElementById(readCellID).innerHTML;

Не знаю, что здесь имелось в виду, но правильно:
Код

tdValue = theTab.rows[ i ].cells[ 0 ].innerHTML

а еще правильнее:
Код

tdValue = theTab.rows[ i ].cells[ 0 ].firstChild.nodeValue

Автор: SelenIT 27.3.2007, 18:02
Я бы использовал ассоциативный массив, наподобие такого:
Код

function SetSubPeriodCountPerDriver(table, readCellPos, writeCellPos)
{
    var TRs= table.rows;
    var count = {};
    for(var i=0; i<TRs.length; i++) // собираем "досье" на данные из readCellPos-того столбца
    {
        tdValue = TRs[i].cells[readCellPos].innerHTML;
        if (count[tdValue]) count[tdValue] = 1;
        else count[tdValue]++;
    }
    for(var i=0; i<TRs.length; i++) // пишем во writeCellPos-тый стоблец цифры из "досье"
    {
        TRs[i].cells[writeCellPos].innerHTML = count[TRs[i].cells[readCellPos].innerHTML];
    }
}

SetSubPeriodCountPerDriver(document.getElementsByTagName('table')[0], 0, 2);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)