Javascript 如何对数组进行排序,同时排除某些元素(保持在数组中的相同位置)
这将在Javascript(jQuery)中实现,但我认为该方法可以在任何语言中使用 我有一个项目数组,需要执行排序但是数组中的某些项必须保持在相同的位置(相同的索引) 所讨论的数组是从Javascript 如何对数组进行排序,同时排除某些元素(保持在数组中的相同位置),javascript,jquery,sorting,arrays,Javascript,Jquery,Sorting,Arrays,这将在Javascript(jQuery)中实现,但我认为该方法可以在任何语言中使用 我有一个项目数组,需要执行排序但是数组中的某些项必须保持在相同的位置(相同的索引) 所讨论的数组是从元素列表中构建的,我使用附加到列表项的.data()值作为排序的值 在这里什么方法最好 <ul id="fruit"> <li class="stay">bananas</li> <li>oranges</li> <li>pear
元素列表中构建的,我使用附加到列表项的.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>
香蕉
- 橙子
- 梨
- 苹果
葡萄
- 菠萝
var sugarcontent=新数组('32'、'21'、'11'、'45'、'8'、'99');
$('水果李')。每个(功能(即,e){
$(此)。数据('糖',糖含量[i]);
})
我希望列表按以下结果排序
<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>
香蕉
- 菠萝
- 苹果
- 橘子
葡萄
- 梨
谢谢 这不会像贝文指出的那样起作用,但出于教育目的,我将把它留在这里:
$('#fruit li').sort(function(a, b) {
return ($(a).hasClass('stay') || $(b).hasClass('stay'))
? 0 : (a.data('sugar') > b.data('sugar') ? 1 : -1);
}).appendTo('#fruit');
注意:您需要使用“sugar”作为名称参数来设置sugar数据:
.data('sugar', sugarcontent[i]);
您认为该解决方案是通用的,适用于任何开发环境,这是正确的 您需要将元素列表划分为两个不同的列表——一个要排序,另一个保持不变。然后,对第一个列表进行排序并与第二个列表合并 您面临的关键问题是:如果您的比较函数依赖于任何外部状态(如项目位置),则大多数排序算法(包括大多数框架中最常见的排序算法)都会变得非常不正常。这应该可以做到:
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);
}
}
这将缓存带有类保留的项目索引,然后按分数排序,然后用类保留替换项目,使其回到正确的位置。算法是:
- 提取和排序未标记有
stay
- 合并
项目和已排序的项目stay
var sugarcontent = new Array(32, 21, 11, 45, 8, 99); var items = $('#fruit li'); items.each(function (i) { $(this).data('sugar', sugarcontent[i]); // Show sugar amount in each item text - for debugging purposes if ($(this).hasClass('stay')) $(this).text("s " + $(this).text()); else $(this).text(sugarcontent[i] + " " + $(this).text()); }); // Sort sortable items var sorted = $(items).filter(':not(.stay)').sort(function (l, r) { return $(l).data('sugar') - $(r).data('sugar'); }); // Merge stay items and sorted items var result = []; var sortedIndex = 0; for (var i = 0; i < items.length; i++) if (!$(items[i]).hasClass('stay')) { result.push(sorted[sortedIndex]); sortedIndex++; } else result.push(items[i]); // Show result $('#fruit').append(result);
var sugarcontent=新数组(32,21,11,45,8,99); var项目=$('水果李'); 项目。每个(功能(i){ $(此)。数据('糖',糖含量[i]); //在每个项目文本中显示糖量-用于调试目的 if($(this).hasClass('stay')) $(this.text)(“s”+$(this.text()); 其他的 $(this.text)(sugarcontent[i]+“”+$(this.text()); }); //对可排序项目进行排序 var sorted=$(items).filter(':not(.stay)).sort(函数(l,r){ 返回$(l).data('sugar')-$(r).data('sugar'); }); //合并停留项目和已排序项目 var结果=[]; var-sortedIndex=0; 对于(变量i=0;i