Mmm. Dur. :) Cela devrait le faire, bien que:
$(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 + ')');
});
});
Tested and works.
Bien que ce qui précède fonctionne, il n'est pas très efficace. Je veux aussi prendre une seconde pour vous suggérer de changer un peu le format de votre HTML. Vous voulez que votre code soit aussi sémantiquement pertinent au contenu qu'il contient que possible. Avoir une grande table qui mélange les parents et les enfants n'est pas la meilleure façon d'y parvenir. Je ne sais pas ce que votre cas d'utilisation est ici, mais envisager de faire quelque chose comme ceci:
<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>
Vous pouvez encore le style de ce mais vous voulez donner l'apparence que vous voulez, mais il ne peut pas être aussi facile si vous vraiment afficher des données tabulaires sur les parents et les enfants.
Avec ce code, cependant, vous pouvez ensuite simplifier ci-dessus avec beaucoup plus efficace:
$('ul > li').each(function() {
var count = $(this).find('li').length;
$('span', this).append(' (' + count + ')');
});
Si la modification du code d'une table à une liste n'est pas possible/souhaité, mais vous avez accès à le code côté serveur qui génère probablement cette table, vous pourriez au moins faciliter les choses, puis en donnant à tous les enfants une classe avec l'ID du parent, et donnant tous les parents d'une classe commune:
<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>
qui vous permettrait alors de le faire, beaucoup plus vite que la solution originale:
$('tr.parent').each(function() {
var id = $(this).attr('id').split('_').pop();
var count = $('tr.parent-' + id).length;
$(this).find('td').append(' (' + count + ')');
});
+1 pour le résoudre, puis en suggérant une disposition plus appropriée eeds. – Jab