这将在Javascript (jQuery)中实现,但我认为该方法可以在任何语言中使用。
我有一个项目数组,我需要执行一个排序。但是,,,数组中的一些项必须保持在相同的位置(相同的索引)。
所讨论的数组是从<li>
元素列表构建的,我使用附加到列表项的.data()值作为排序的值。
这里最好的办法是什么?
<ul id="fruit">
<li class="stay">bananas</li>
<li>oranges</li>
<li>pears</li>
<li>apples</li>
<li class="stay">grapes</li>
<li>pineapples</li>
</ul>
<script type="text/javascript">
var sugarcontent = new Array('32','21','11','45','8','99');
$('#fruit li').each(function(i,e){
$(this).data('sugar',sugarcontent[i]);
})
</script>
我希望列表与以下结果排序..。
<ul id="fruit">
<li class="stay">bananas</li> <!-- score = 32 -->
<li>pineapples</li> <!-- score = 99 -->
<li>apples</li> <!-- score = 45 -->
<li>oranges</li> <!-- score = 21 -->
<li class="stay">grapes</li> <!-- score = 8 -->
<li>pears</li> <!-- score = 11 -->
</ul>
谢谢!
发布于 2010-03-26 04:53:56
算法是:
未用stay
var含糖量=新数组(32、21、11、45、8、99);var item =$(‘#果树’);items.each(函数(i) {$(This).data(‘砂糖’,糖分);//显示每个项目文本中的糖量--如果($(This).hasClass(‘s’)) $(this).text("s“+$(This).text())用于调试;其他$(This).text(糖分+“”+$(This).text();});//排序排序项var排序=$( items ).filter(‘:not(.stay)’).sort(函数(l,r) {返回$(L).data(‘砂糖’)-$(R).data(‘糖’);};//合并保留项和排序项var结果= [];var sortedIndex = 0;for (var i= 0;I< items.length;i++) if (!$(Itemsi).hasClass(‘result.push’)){ result.push(sortedsortedIndex);sortedIndex++;} else result.push(itemsi);// Show .hasClass
发布于 2010-03-25 21:01:51
这应该可以做到:
var sugarcontent = new Array('32','21','11','45','8','99');
var list = $('#fruit');
var lis = list.find('li').each(function(i,e){
$(this).data('score',sugarcontent[i]);
});
var stay = lis.filter('.stay').each(function(){
$(this).data('index',$(this).index());
});
lis.sort(function(a,b){
return $(b).data('score') - $(a).data('score');
}).appendTo(list);
stay.each(function(){
var index = $(this).data('index');
if (index == 0) {
list.prepend(this);
} else {
lis.filter(':eq('+index+')').insertAfter(this);
}
}
它将项目的索引缓存为类停留,然后按分数进行排序,然后将项目替换为类停留在正确的位置。
发布于 2010-03-25 20:44:31
这不像贝文指出的那样有效,但为了教育目的,我将把它留在这里:
$('#fruit li').sort(function(a, b) {
return ($(a).hasClass('stay') || $(b).hasClass('stay'))
? 0 : (a.data('sugar') > b.data('sugar') ? 1 : -1);
}).appendTo('#fruit');
注意:您需要使用“砂糖”作为名称参数来设置糖数据:
.data('sugar', sugarcontent[i]);
https://stackoverflow.com/questions/2519103
复制相似问题