You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery按价格排序商品数组后页面未更新问题求解

问题排查原因
  • 核心问题:排序逻辑没有分支执行,无论选择哪种排序类型,都会先执行价格排序的DOM插入、再执行字母排序的DOM插入。后执行的字母排序阶段操作会完全覆盖价格排序的结果,所以价格排序的效果永远无法呈现,只有字母排序的逻辑能生效。
  • 优化点1:sort排序逻辑放在双层循环内部,会被重复执行多次,性能损耗极大,应该在循环前先完成排序。
  • 优化点2:插入新排序结果前没有清空容器原有内容,会导致商品重复叠加。
  • 优化点3:单独存储价格、名称数组和原始DOM元素没有做绑定,遇到多个商品价格/名称相同时会出现匹配错误。
修复后可用代码
// 初始化时存储原始商品列表,避免重复查询DOM
const originalProductList = Array.from($("#product-items").children());

$(document.body).on('change', '#products-sorting', function() {
  const currentSortType = $(this).val();
  const $productWrap = $("#product-items");
  // 清空原有列表
  $productWrap.empty();
  // 拷贝原始数组做排序,不修改原始数据
  const sortedList = [...originalProductList];

  // 价格排序分支
  if (currentSortType.includes('Price')) {
    sortedList.sort((prev, next) => {
      const pricePrev = parseFloat($(prev).find('.addToWishlist').data('price').replace('$', ''));
      const priceNext = parseFloat($(next).find('.addToWishlist').data('price').replace('$', ''));
      return currentSortType === 'Price, low to high' ? pricePrev - priceNext : priceNext - pricePrev;
    })
  } 
  // 字母排序分支
  else if (currentSortType.includes('Alphabetically')) {
    sortedList.sort((prev, next) => {
      const namePrev = $(prev).find('.addToWishlist').data('name').toUpperCase();
      const nameNext = $(next).find('.addToWishlist').data('name').toUpperCase();
      if (namePrev < nameNext) return currentSortType === 'Alphabetically, A to Z' ? -1 : 1;
      if (namePrev > nameNext) return currentSortType === 'Alphabetically, A to Z' ? 1 : -1;
      return 0;
    })
  }

  // 插入排序后的商品
  sortedList.forEach(item => $productWrap.append(item));
});

内容的提问来源于stack exchange,提问作者Safina Siddique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:21:02