Ммм. Крепкий орешек. :) Это должно сделать это, хотя:
$(function() {
$("tr[id^='parent_']").each(function() {
var count = 0;
$(this).nextAll('tr').each(function() {
if($(this).hasClass('child')) {
count++;
} else {
return false;
}
});
$(this).find('td').append(' (' + count + ')');
});
});
Протестировано и работает .
Хотя вышеперечисленное работает, оно не очень эффективно. Я также хочу взять секунду, чтобы предложить вам немного изменить формат вашего HTML. Вы хотите, чтобы ваш код был максимально семантически релевантным содержанию, которое он содержит. Наличие одного огромного стола, объединяющего родителей и детей, не является оптимальным способом достижения этого. Я не уверен, что ваш вариант использования здесь, но подумайте над тем, чтобы сделать что-то вроде этого:
<ul>
<li id="parent_1">
<span>Parent 1</span>
<ul>
<li>Children 1</li>
<li>Children 2</li>
<li>Children 3</li>
</ul>
</li>
<li id="parent_2">
<span>Parent 2</span>
<ul>
<li>Children 1</li>
</ul>
</li>
<li id="parent_3">
<span>Parent 3</span>
<ul>
<li>Children 1</li>
<li>Children 2</li>
</ul>
</li>
</ul>
Вы можете по-прежнему оформлять это, как хотите, чтобы придать ему желаемый вид, хотя это может быть не так просто, если вы действительно отображаете табличные данные о родителях и детях.
Однако с помощью этого кода вы можете упростить вышесказанное с помощью гораздо более эффективного:
$('ul > li').each(function() {
var count = $(this).find('li').length;
$('span', this).append(' (' + count + ')');
});
Если изменение кода из таблицы в список невозможно / нежелательно, но у вас есть доступ к коду на стороне сервера, который предположительно генерирует эту таблицу, вы могли бы по крайней мере упростить задачу, дав всем детям класс с идентификатором родителя и предоставлением всем родителям общего класса:
<table>
<tr id="parent_1" class="parent">
<td>Parent 1</td>
</tr>
<tr class="child parent-1">
<td>Child 1</td>
</tr>
<tr class="child parent-1">
<td>Child 2</td>
</tr>
<tr id="parent_2" class="parent">
<td>Parent2</td>
</tr>
<tr class="child parent-2">
<td>Child 1</td>
</tr>
<tr id="parent_3" class="parent">
<td>Parent3</td>
</tr>
<tr class="child parent-3">
<td>Child 1</td>
</tr>
<tr class="child parent-3">
<td>Child 2</td>
</tr>
<tr class="child parent-3">
<td>Child 3</td>
</tr>
</table>
Что позволит вам сделать это намного быстрее, чем оригинальное решение:
$('tr.parent').each(function() {
var id = $(this).attr('id').split('_').pop();
var count = $('tr.parent-' + id).length;
$(this).find('td').append(' (' + count + ')');
});