如何通过使用 jquery 单击复选框对项目列表进行排序?

设计师

我有以下项目列表,我使用 jquery 对它们进行排序,例如(最佳评级、最低订单等)

当我按评分对项目进行排序时,它工作得非常好,因为我在列表顶部获得了评分最高的项目。我的问题是当我尝试按最小订购量对商品进行排序时。我想获得列表顶部的最低价格。

看看我的代码如下:

jQuery.fn.reverse = [].reverse;

var sl = $('.storesList')
  
sl.children().reverse().each(function(i) {
  $(this).data({
    original: i + 1,
    rating: +$(".rating", this).text().replace(/[^\d\.]/g, ""),
     minimumorder: +$(".minorder", this).text().replace(/[^\d\.]/g, ""),
    open: $(".open-or-close-tag", this).text() === "CLOSE" ? 0 : 1
  })

})


$('#count').text($('.storesList  .store-block:visible').length);
$(".checkboxes-area").change(function() {
  var byRate = $("#by-rate").prop("checked")
  var isOpen = $("#stores-open-now").prop("checked")
  var byminOrder = $("#by-minimum-order").prop("checked")
  var s = sl.children().get().sort(function(a, b) {
    var aSort = key(a),
        bSort = key(b)
    return aSort < bSort ? 1 : aSort === bSort ? 0 : -1
  })
  $(sl).append(s)


  function key(el) {
    var res = $(el).data("original") * 0.00001
    if (byRate) res = $(el).data("rating")
    if (byminOrder) res = $(el).data("minimumorder")
    if (isOpen) res *= $(el).data("open")
    return res
  }
})
.storesList {
  margin-top: 20px;
}

#count {
  display: inline-block;
}

.store-block {
  width: 80%;
  margin-bottom: 10px;
  padding: 5px;
  background: #e5e5e5;
  position: relative;
  overflow: hidden;
}

.rating {
  position: absolute;
  right: 70px;
  top: 3px;
}

.minorder {
  position: absolute;
  right: 180px;
  top: 3px;  
}

.open-or-close-tag {
  position: absolute;
  right: 10px;
  top: 5px;
  font-size: 11px;
  font-weight: bold;
  color: blue;
}

.right {
  float: right;
}

.left {
  float: left;
}

.hide-me {
  display: none;
}

.checkbox-lab {
  font-size: 12px;
  font-weight: bold;
  cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div class="checkboxes-area">
  <label class="checkbox-lab"><span>OPEN FIRST</span>
 <input type="checkbox" id="stores-open-now">
</label>


<label class="checkbox-lab"><span>BEST RATED</span>
<input type="checkbox" id="by-rate">
</label>

<label class="checkbox-lab"><span>BY MINIMUM ORDER</span>
<input type="checkbox" id="by-minimum-order">
</label>



</div>


<div class="storesList">

  <div class="store-block">
    <div class="store-name">Apple Store</div>
    <div class="rating">&bigstar; 4.5</div>
    <div class="minorder">100 €</div>
    <div class="open-or-close-tag">CLOSE</div>
  </div>

  <div class="store-block">
    <div class="store-name">Nokia Store</div>
    <div class="rating">&bigstar; 3.8</div>
    <div class="minorder">250 €</div>
    <div class="open-or-close-tag">OPEN</div>
  </div>

  <div class="store-block">
    <div class="store-name">Samsung Store</div>
    <div class="rating">&bigstar; 4.0</div>
    <div class="minorder">25 €</div>
    <div class="open-or-close-tag">CLOSE</div>
  </div>

  <div class="store-block">
    <div class="store-name">Linux</div>
    <div class="rating">&bigstar; 4.9</div>
    <div class="minorder">50 €</div>
    <div class="open-or-close-tag">OPEN</div>
  </div>



</div>

亚廷

它按降序排序的原因是排序调用中的比较函数为 返回正数(+1)aSort < bSort,这对于“首先打开”和“最佳评级”都适用,但不适用于“按最小顺序”。所有需要改变的是,您需要为 minimumorder 返回负数,如此处代码的修改版本(关键方法已修改为返回负数)。您将需要通过更改某些条件来修复组合方案,例如,如果您想要先开单和最小订单,那么现在无法一起工作。如果您需要更多帮助,请告诉我。

jQuery.fn.reverse = [].reverse;

var sl = $('.storesList')

sl.children().reverse().each(function(i) {
  $(this).data({
    original: i + 1,
    rating: +$(".rating", this).text().replace(/[^\d\.]/g, ""),
     minimumorder: +$(".minorder", this).text().replace(/[^\d\.]/g, ""),
    open: $(".open-or-close-tag", this).text() === "CLOSE" ? -1 : 1
  })
})

var slByOrderAmount = $.makeArray(sl.children().map(function(index, el){
  return $(el).data("minimumorder");
})).sort(function(a, b){return a - b}).reverse();

//console.log(slByOrderAmount);

$('#count').text($('.storesList  .store-block:visible').length);
$(".checkboxes-area").change(function() {
  var byRate = $("#by-rate").prop("checked");
  var isOpen = $("#stores-open-now").prop("checked");
  var byminOrder = $("#by-minimum-order").prop("checked");
  //console.log("ByRate = " + byRate + ", ByMinOrder = " + byminOrder + ", IsOpen = " + isOpen);
  sl.children().each(function(){
    var $this = $(this);
    //console.log("Name: " + $this.find(".store-name").html() + ", Original: " + $this.data("original") + ", Rating: " + $this.data("rating") + ", MinOrder: " + $this.data("minimumorder") + ", Open: " + $this.data("open") + ", Result: " + key(this));
  });
  var s = sl.children().get().sort(function(a, b) {
    var aSort = key(a),
        bSort = key(b)
    return aSort < bSort ? 1 : aSort === bSort ? 0 : -1
  });
  $(sl).append(s);


  function key(el) {
   var $el = $(el);
    var res = 1;
    if (byRate == true) res = $el.data("rating");
    if (byminOrder == true) res = slByOrderAmount.indexOf($el.data("minimumorder"));
    if (isOpen == true) res *= $el.data("open");
    res += $el.data("original") * 0.00001;
    return res;
  }
})
.storesList {
  margin-top: 20px;
}

#count {
  display: inline-block;
}

.store-block {
  width: 80%;
  margin-bottom: 10px;
  padding: 5px;
  background: #e5e5e5;
  position: relative;
  overflow: hidden;
}

.rating {
  position: absolute;
  right: 70px;
  top: 3px;
}

.minorder {
  position: absolute;
  right: 180px;
  top: 3px;  
}

.open-or-close-tag {
  position: absolute;
  right: 10px;
  top: 5px;
  font-size: 11px;
  font-weight: bold;
  color: blue;
}

.right {
  float: right;
}

.left {
  float: left;
}

.hide-me {
  display: none;
}

.checkbox-lab {
  font-size: 12px;
  font-weight: bold;
  cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<div class="checkboxes-area">
  <label class="checkbox-lab"><span>OPEN FIRST</span>
 <input type="checkbox" id="stores-open-now">
</label>


<label class="checkbox-lab"><span>BEST RATED</span>
<input type="checkbox" id="by-rate">
</label>

<label class="checkbox-lab"><span>BY MINIMUM ORDER</span>
<input type="checkbox" id="by-minimum-order">
</label>



</div>


<div class="storesList">

  <div class="store-block">
    <div class="store-name">Apple Store</div>
    <div class="rating">&bigstar; 4.5</div>
    <div class="minorder">100 €</div>
    <div class="open-or-close-tag">CLOSE</div>
  </div>

  <div class="store-block">
    <div class="store-name">Nokia Store</div>
    <div class="rating">&bigstar; 3.8</div>
    <div class="minorder">250 €</div>
    <div class="open-or-close-tag">OPEN</div>
  </div>

  <div class="store-block">
    <div class="store-name">Samsung Store</div>
    <div class="rating">&bigstar; 4.0</div>
    <div class="minorder">25 €</div>
    <div class="open-or-close-tag">CLOSE</div>
  </div>

  <div class="store-block">
    <div class="store-name">Linux</div>
    <div class="rating">&bigstar; 4.9</div>
    <div class="minorder">50 €</div>
    <div class="open-or-close-tag">OPEN</div>
  </div>



</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何减少jQuery中复选框列表的代码大小?

使用CSS类进行验证时,jQuery验证程序不适用于复选框列表

在tr复选框上使用.not()的jQuery .on()tr单击事件?

使用复选框列表中的jQuery追加文本

使用jQuery的复选框

使用jQuery选中复选框的MultiSelect下拉列表

每当使用Jquery单击td时,如何将复选框标记为已选中?

如何使用jQuery计算复选框?

使用jQuery滚动到复选框列表中的特定项目

如何通过使用jquery选中复选框,从包含具有特定文本的div的列表中过滤元素?

使用jQuery选择列表中的所有复选框

使用jQuery打开复选框的单击选择下拉列表

如何使用jQuery检测页面上任何复选框的单击事件?

使用jQuery Ajax进行复选框过滤

使用JQUERY选定的cb列表进行复选框过滤

使用JQuery在单击父复选框时选中所有直接子复选框

JQuery中的逻辑,使用复选框进行更新

使用Jquery单击时取消选择复选框

使用JQuery复选框过滤项目列表

当我使用jQuery单击“选择”按钮时,如何选择所有复选框

当使用jQuery更改复选框属性时,模拟对多个复选框的单击以发出AJAX请求

当通过jQuery单击一个复选框时,如何选择所有复选框并取消选择?

复选框单击,然后使用jQuery删除验证

使用javascript / jQuery从列表中选择复选框

如何通过asp.net mvc中的自定义jQuery验证复选框列表

使用 JQuery 单击复选框按钮时如何启用和禁用按钮

如何遍历 jQuery 中的复选框列表?

如何使用jQuery在单击时从标签复选框中删除类

如何通过确认模式 JQuery Flask 传递选中的复选框列表