首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对数组进行排序,同时排除某些元素(保持在数组中的相同位置)

如何对数组进行排序,同时排除某些元素(保持在数组中的相同位置)
EN

Stack Overflow用户
提问于 2010-03-25 20:27:12
回答 3查看 5.5K关注 0票数 8

这将在Javascript (jQuery)中实现,但我认为该方法可以在任何语言中使用。

我有一个项目数组,我需要执行一个排序。但是,,数组中的一些项必须保持在相同的位置(相同的索引)。

所讨论的数组是从<li>元素列表构建的,我使用附加到列表项的.data()值作为排序的值。

这里最好的办法是什么?

代码语言:javascript
运行
复制
<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>

我希望列表与以下结果排序..。

代码语言:javascript
运行
复制
<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>

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-26 04:53:56

算法是:

未用stay

  • Merge

  • 项和排序项标记的
  • 提取和排序项

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

票数 8
EN

Stack Overflow用户

发布于 2010-03-25 21:01:51

这应该可以做到:

代码语言:javascript
运行
复制
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);
    }
}

它将项目的索引缓存为类停留,然后按分数进行排序,然后将项目替换为类停留在正确的位置。

票数 3
EN

Stack Overflow用户

发布于 2010-03-25 20:44:31

这不像贝文指出的那样有效,但为了教育目的,我将把它留在这里:

代码语言:javascript
运行
复制
$('#fruit li').sort(function(a, b) {
    return ($(a).hasClass('stay') || $(b).hasClass('stay'))
        ? 0 : (a.data('sugar') > b.data('sugar') ? 1 : -1);
}).appendTo('#fruit');

注意:您需要使用“砂糖”作为名称参数来设置糖数据:

代码语言:javascript
运行
复制
.data('sugar', sugarcontent[i]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2519103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档