Reputation: 3226
I need to rearrange some elements based on their content. More exactly bases on the .extrafield-name
content. The below html code shows all the elements in their default order with some dummy values. Something that might make this a bit more difficult is that they only show up if value is assigned to them.
<section class="class-info">
<div class="class-info-title">
<h4>Fighter Information</h4>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Weight: </span>
<span class="extrafield-value">114 lbs</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Losses: </span>
<span class="extrafield-value">99</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Wins: </span>
<span class="extrafield-value">99</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Fights: </span>
<span class="extrafield-value">8</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Draws: </span>
<span class="extrafield-value">99</span>
</div>
</div>
</section>
I got them all in an array, but I need a correct way to sort them.
var all = $(".class-info-content").map(function() {
return this.innerHTML;
}).get();
//console.log(all.join());
console.log(all[0]);
Order: Fights, Wins, Losses, Draws, Weight
Upvotes: 0
Views: 328
Reputation: 35670
Place the desired order in an array, then sort the .class-info-content
DIVs based on their .extrafield-name
text's index into that array.
Once sorted, the DIVs can simply be inserted after their section's .class-info-content
:
$('.class-info').each(function() {
$(this).find('.class-info-content')
.sort(function(a, b) {
var order = ['Fights:', 'Wins:', 'Losses:', 'Draws:', 'Weight:'],
posa = order.indexOf($(a).find('.extrafield-name').text().trim()),
posb = order.indexOf($(b).find('.extrafield-name').text().trim());
return posa - posb;
})
.insertAfter($(this).find('.class-info-title'));
});
$('.class-info').each(function() {
$(this).find('.class-info-content')
.sort(function(a, b) {
var order = ['Fights:', 'Wins:', 'Losses:', 'Draws:', 'Weight:'],
posa = order.indexOf($(a).find('.extrafield-name').text().trim()),
posb = order.indexOf($(b).find('.extrafield-name').text().trim());
return posa - posb;
})
.insertAfter($(this).find('.class-info-title'));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section class="class-info">
<div class="class-info-title">
<h4>Fighter Information</h4>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Weight: </span>
<span class="extrafield-value">114 lbs</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Losses: </span>
<span class="extrafield-value">99</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Wins: </span>
<span class="extrafield-value">99</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Fights: </span>
<span class="extrafield-value">8</span>
</div>
</div>
<div class="class-info-content">
<div class="info-content">
<span class="extrafield-name">Draws: </span>
<span class="extrafield-value">99</span>
</div>
</div>
</section>
Upvotes: 2