jQuery 根据所选参数对 ul 内的 li 进行排序

标签 jquery list sorting

我在 ul 中有多个 li,需要根据选择输入中选择的参数进行排序。我用来实现这一点的 jQuery 基本上是:

$("#SortBy").on('change', function() {

        var span = $(".divResult > ul.list > li > ul > li span:nth-child(2)")
        var spantoSort = $(".divResult > ul.list > li.Brand > ul > li." + $(this).find("option:selected").text() + " > span:nth-child(2)")

        spantoSort.sort(function(a, b) {
        return $(a).text().localeCompare($(b).text())
        }).each(function(new_Index) {
            var original_Index = $(this).index();

            span.each(function() {
            var Parentli = $(this).parents('.Brand');
            if (original_Index !== new_Index)
            Parentli.eq(original_Index).insertAfter(Parentli.eq(new_Index));
            });    
        });
    });
});

但由于某种原因,这并没有对“li”进行排序,而类似的代码可以在对表的列进行排序的情况下使用。

下面是完整的工作代码:

jQuery(document).ready(function($) {

  $("#SortBy").on('change', function() {

    var span = $(".divResult > ul.list > li > ul > li span:nth-child(2)")
    var spantoSort = $(".divResult > ul.list > li.Brand > ul > li." + $(this).find("option:selected").text() + " > span:nth-child(2)")
    console.log(span, spantoSort);

    spantoSort.sort(function(a, b) {
      return $(a).text().localeCompare($(b).text())
    }).each(function(new_Index) {
      var original_Index = $(this).index();
      console.log(original_Index);

      span.each(function() {
        var Parentli = $(this).parents('.Brand');
        console.log(Parentli);
        if (original_Index !== new_Index)
          Parentli.eq(original_Index).insertAfter(Parentli.eq(new_Index));
      });
    });

  });

});
ul.list {
  border-bottom: 2px solid #eee;
  font-size: 14px;
  margin: 0 0 20px 0;
  font-size-adjust: inherit;
  font-family: "Trebuchet MS", Arial, Verdana, sans-serif;
}

ul.list.nrh {
  border-bottom: 2px solid #ddd;
}

ul.list.nrh>li {
  border-top: 2px solid #ddd;
}

ul.list,
ul.list>li>ul {
  padding: 0 !important;
  list-style: none !important;
}

ul.list>li>ul {
  margin: 0 !important;
}

ul.list>li .titles {
  background-color: rgb(58, 146, 7);
  display: block;
  color: #fff;
  padding: 10px;
  font-weight: 800;
}

ul.list>li>ul>li {
  font-weight: 200;
  border-bottom: 1px solid #eee;
  padding: 10px;
}

ul.list>li>ul>li:hover {
  background-color: #efefef
}

ul.list>li>ul>li:last-child {
  border-bottom: none;
}

ul.list ul>li .row_headers {
  font-size: 14px;
  max-width: 40%;
  float: left;
  margin-right: 3%;
}

ul.list ul>li .row_data {
  float: right;
  font-weight: 800;
  width: 57%;
}

ul.list>li>ul>li {
  *zoom: 1;
}

ul.list>li>ul>li:before,
ul.list>li>ul>li:after {
  content: " ";
  display: table;
}

ul.list>li>ul>li:after {
  clear: both;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
Sort by:
<select id="SortBy">
  <option></option>
  <option>Ranking</option>
  <option>Rating</option>
</select>
<br></br>
<div id="divResult" class="divResult">
  <ul class="list" id="list">
    <li name="Samsung" class="Brand">
      <span class="titles">Samsung</span>
      <ul>
        <li class="Ranking">
          <span class="row_headers">Ranking</span>
          <span>3</span>
        </li>
        <li class="Rating">
          <span class="row_headers">Rating</span>
          <span>2.5</span>
        </li>
      </ul>
    </li>
    <li name="Mi" class="Brand">
      <span class="titles">Mi</span>
      <ul>
        <li class="Ranking">
          <span class="row_headers">Ranking</span>
          <span>2</span>
        </li>
        <li class="Rating">
          <span class="row_headers">Rating</span>
          <span class="row_html">3.5</span>
        </li>
      </ul>
    </li>
    <li name="Apple" class="Brand">
      <span class="titles">Apple</span>
      <ul>
        <li class="Ranking">
          <span class="row_headers">Ranking</span>
          <span class="row_html">1</span>
        </li>
        <li class="Rating">
          <span class="row_headers">Rating</span>
          <span class="row_html">4.5</span>
        </li>
      </ul>
    </li>
  </ul>
</div>

还包括 jsfiddle 供您引用:https://jsfiddle.net/mithunu/ejgdtbnk/2/

最佳答案

您可能不需要使用 new_index 重新排列每个 div,而只需将排序后的 li 直接插入到 ul

$("#SortBy").on('change', function() {

  var span = $(".divResult > ul.list > li")
  var option = $(this).val();

  span.sort(function(a, b) {
    a = $(a).find('li.' + option + ' span:nth-child(2)').text()
    b = $(b).find('li.' + option + ' span:nth-child(2)').text()
    return a.localeCompare(b)
  })

  $('#list').html(span);

});
ul.list {
  border-bottom: 2px solid #eee;
  font-size: 14px;
  margin: 0 0 20px 0;
  font-size-adjust: inherit;
  font-family: "Trebuchet MS", Arial, Verdana, sans-serif;
}


/* Table with no row headers */

ul.list.nrh {
  border-bottom: 2px solid #ddd;
}


/* Table with no row headers columns */

ul.list.nrh>li {
  border-top: 2px solid #ddd;
}


/* Table defaults */

ul.list,
ul.list>li>ul {
  padding: 0 !important;
  list-style: none !important;
}


/* Inner list */

ul.list>li>ul {
  margin: 0 !important;
}


/* Table titles */

ul.list>li .titles {
  background-color: rgb(58, 146, 7);
  display: block;
  color: #fff;
  padding: 10px;
  font-weight: 800;
}


/* Table rows */

ul.list>li>ul>li {
  font-weight: 200;
  border-bottom: 1px solid #eee;
  padding: 10px;
}


/* Table rows hover */

ul.list>li>ul>li:hover {
  background-color: #efefef
}


/* Table last child row */

ul.list>li>ul>li:last-child {
  border-bottom: none;
}


/* Table row header */

ul.list ul>li .row_headers {
  font-size: 14px;
  max-width: 40%;
  float: left;
  margin-right: 3%;
}


/* Table row data */

ul.list ul>li .row_data {
  float: right;
  font-weight: 800;
  width: 57%;
}


/* Clearfix */

ul.list>li>ul>li {
  *zoom: 1;
}

ul.list>li>ul>li:before,
ul.list>li>ul>li:after {
  content: " ";
  display: table;
}

ul.list>li>ul>li:after {
  clear: both;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Sort by:
<select id="SortBy">
  <option></option>
  <option>Ranking</option>
  <option>Rating</option>
</select>
<br><br>
<div id="divResult" class="divResult">
  <ul class="list" id="list">
    <li name="Samsung" class="Brand">
      <span class="titles">Samsung</span>
      <ul>
        <li class="Ranking">
          <span class="row_headers">Ranking</span>
          <span>3</span>
        </li>
        <li class="Rating">
          <span class="row_headers">Rating</span>
          <span>2.5</span>
        </li>
      </ul>
    </li>
    <li name="Mi" class="Brand">
      <span class="titles">Mi</span>
      <ul>
        <li class="Ranking">
          <span class="row_headers">Ranking</span>
          <span>2</span>
        </li>
        <li class="Rating">
          <span class="row_headers">Rating</span>
          <span class="row_html">3.5</span>
        </li>
      </ul>
    </li>
    <li name="Apple" class="Brand">
      <span class="titles">Apple</span>
      <ul>
        <li class="Ranking">
          <span class="row_headers">Ranking</span>
          <span class="row_html">1</span>
        </li>
        <li class="Rating">
          <span class="row_headers">Rating</span>
          <span class="row_html">4.5</span>
        </li>
      </ul>
    </li>
  </ul>
</div>

关于jQuery 根据所选参数对 ul 内的 li 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57302292/

相关文章:

javascript - 按钮中的 GIF 图像

c# - 哪个更好?数组、ArrayList 或 List<T>(在性能和速度方面)

c - 排序链表时出现段错误

Python-如何拆分字符串列表以按原始顺序获得唯一的拆分

c# - 在 C# 中对包含子项的列表进行排序

C++ 排序无法对字符串集进行排序?

javascript - 回调函数自动滚动失败

javascript - Jquery addclass 无法将 "fadeoutdown"效果应用于 DIV

javascript - 使用 jQuery each 和 javascript 正则表达式匹配 HTML block 中的最低价和最高价

python - 将内部列表的元素相乘作为列表理解