如何排序数组,但排除某些元素(保持在数组中的相同位置)

cal*_*die 6 javascript arrays sorting jquery

这将在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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

谢谢!

Kon*_*rin 7

算法是:

  • 提取和排序未标记的项目 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);
    
    Run Code Online (Sandbox Code Playgroud)