Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对数组进行排序,同时排除某些元素(保持在数组中的相同位置)_Javascript_Jquery_Sorting_Arrays - Fatal编程技术网

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

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

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

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

所讨论的数组是从
  • 元素列表中构建的,我使用附加到列表项的.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

    这种方法的问题是,固定项会成为排序的障碍-固定点下方的任何项都不会在其上方移动,反之亦然。由于指出了语法错误,我已修复了上面的示例代码。我应该使用jQuery合并函数还是连接数组和属性?当索引相同时,如何确保“固定”项数组具有优先级?你提出的解决方案正是我第一次尝试这样做的方式,但我无法让它起作用。至少我知道我在正确的轨道上。谢谢你的意见!@Konstantin的答案对我来说似乎很好(我的Javascript无法完成任务。+1)这是最类似于我最终得到的代码,因此我将其标记为正确-我确信petersendidit提供的解决方案也很好(尽管它未经测试)。谢谢