Jquery中的数组排序问题(按价格排序)

Posted

技术标签:

【中文标题】Jquery中的数组排序问题(按价格排序)【英文标题】:Array sorting problem(sort by price) in Jquery 【发布时间】:2021-11-06 07:39:24 【问题描述】:

我正在按价格和字母顺序对商品进行排序。 它按字母顺序排序非常好。它正在排序价格数组,但不根据排序后的价格打印对象。在 console.log 中一切都做得很完美,但是当我选择价格从低到高的选项时,它不会对项目进行任何更改,而在控制台中进行。

$(document.body).on('change', '#products-sorting', function() 

  var priceArr = [];
  var nameArr = [];
  for (var i = 0; i < tempArr.length; i++) 
    var price = $(tempArr[i]).find('.addToWishlist').data("price").replace("$", "");
    var name = $(tempArr[i]).find('.addToWishlist').data("name");
    priceArr.push(price)
    nameArr.push(name);
  
  //sort by Price
  for (var n = 0; n < priceArr.length; n++) 
    for (var i = 0; i < tempArr.length; i++) 
      //sort price low to high
      if ($(this).val() === 'Price, low to high') 
        priceArr.sort(function(a, b) 
          return a - b
        )
      
      //sort price high to low
      if ($(this).val() === 'Price, high to low') 
        priceArr.sort(function(a, b) 
          return b - a
        )
      
      var price = $(tempArr[i]).find('.addToWishlist').data("price").replace("$", "");
      if (priceArr[n] == price)
        $("#product-items").append(tempArr[i])
    
  
  //console.log(priceArr)
  //sort Alphabetically
  for (var n = 0; n < nameArr.length; n++) 
    for (var i = 0; i < tempArr.length; i++) 
      //sort alphabetically A to Z 
      if ($(this).val() === 'Alphabetically, A to Z')
        nameArr.sort();
      //sort alphabetically Z to A
      if ($(this).val() === 'Alphabetically, Z to A') 
        nameArr.sort();
        nameArr.reverse()
      
      var name = $(tempArr[i]).find('.addToWishlist').data("name");
      if (nameArr[n] == name)
        $("#product-items").append(tempArr[i])
    
  

)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="select-box" class="clearfix">
  <label for="products">Sort by</label>
  <select name="products" id="products-sorting">
    <option value="Featured">Featured</option>
    <option value="Alphabetically, A to Z">Alphabetically, A to Z</option>
    <option value="Alphabetically, Z to A">Alphabetically, Z to A</option>
    <option value="Price, low to high">Price, low to high</option>
    <option value="Price, high to low">Price, high to low</option>
  </select>
</div>

【问题讨论】:

什么是tempArr 为什么你的排序有循环?您应该对数组进行一次排序,然后循环遍历结果以更新表格。 我有一个包含 html 内容(tempArr)的对象数组。这就是为什么我需要循环。 我从那个数组中检索价格和名称来制作单独的数组 但是每次循环都在对同一个数组进行排序。排序不会改变。 【参考方案1】:

您不需要在循环内进行排序。只需对tempArr 进行排序,而不是复制到priceArrnameArr。然后您可以将tempArr 附加到容器以按排序顺序显示它。

$(document.body).on('change', '#products-sorting', function() 

  function getPrice(el) 
    return parseFloat($(el).find('.addToWishlist').data("price").replace("$", ""));
  

  function getName(el) 
    return $(el).find('.addToWishlist').data("name");
  

  switch ($(this).val()) 
    //sort price low to high
    case 'Price, low to high':
      tempArr.sort((a, b) => getPrice(a) - getPrice(b));
      break;
      //sort price high to low
    case 'Price, high to low':
      tempArr.sort((a, b) => getPrice(b) - getPrice(a));
      break;
    case 'Alphabetically, A to Z':
      tempArr.sort((a, b) => getName(a).localeCompare(getName(b)));
      break;
    case 'Alphabetically, Z to A':
      tempArr.sort((a, b) => getName(b).localeCompare(getName(a)));
      break;
  
  
  $("#product-items").empty().append(tempArr);
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="select-box" class="clearfix">
  <label for="products">Sort by</label>
  <select name="products" id="products-sorting">
    <option value="Featured">Featured</option>
    <option value="Alphabetically, A to Z">Alphabetically, A to Z</option>
    <option value="Alphabetically, Z to A">Alphabetically, Z to A</option>
    <option value="Price, low to high">Price, low to high</option>
    <option value="Price, high to low">Price, high to low</option>
  </select>
</div>

【讨论】:

以上是关于Jquery中的数组排序问题(按价格排序)的主要内容,如果未能解决你的问题,请参考以下文章

使用猫鼬对数组中的值进行排序

数组排序中的 JavaScript 与 PHP

JQuery使用日期对对象数组进行排序[重复]

如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?

具有更多对象的Jquery排序数组[重复]

jQuery对象数组排序