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

JavaScript点击按钮按价格排序商品数组功能失效问题排查

问题排查与修复方案

核心问题点

  • 排序函数未返回排序后的数组
    你编写的两个排序函数仅将排序结果赋值给了未声明的全局变量arr,没有return任何值,因此调用ordmenorPrecio(productdata)这类方法时返回的是undefined,传给渲染函数mostrarProductos的参数为空,自然无法正常渲染。
  • 商品数据productdata作用域错误
    productdata是异步请求getJSONData的回调内部局部变量,你在回调外部绑定点击事件时直接访问productdata,会报变量未定义的错误,即使请求完成后也无法访问到这个局部变量。
  • 可选优化:Array.sort是原地排序方法,会直接修改原数组,建议先对原数组做浅拷贝再排序,避免污染原始数据,影响后续其他依赖原数据的逻辑。

修复后的代码

1. 排序函数修复

// 升序排序(价格从低到高)
function ordmayorPrecio(arrprod) {
    // 先浅拷贝原数组再排序,避免修改原数据
    return [...arrprod].sort(function (a,b){
        let precioa = parseInt(a.cost)
        let preciob = parseInt(b.cost)
        return precioa - preciob;
    })
}

// 降序排序(价格从高到低)
function ordmenorPrecio(arrprod) {
    return [...arrprod].sort(function (a,b){
        let precioa = parseInt(a.cost)
        let preciob = parseInt(b.cost)
        return preciob - precioa;
    })
}

如果商品价格存在小数,可以把parseInt替换为parseFloat兼容小数场景。

2. 事件绑定逻辑修复

document.addEventListener("DOMContentLoaded", function (e) {
    // 在当前作用域声明变量存储商品数据,供点击事件访问
    let productdata = [];
    getJSONData(PRODUCTS_URL)
    .then((result) => result.data)
    .then((data) => {
        // 把请求返回的数据赋值给上层作用域的变量
        productdata = data;
        // 首次渲染商品列表
        mostrarProductos(productdata);
    });

    document.getElementById("sortDescPrice").addEventListener("click", function(){
        // 增加数据加载完成判断,避免请求未完成时报错
        if(productdata.length) {
            mostrarProductos(ordmenorPrecio(productdata));
        }
    });

    document.getElementById("sortAscPrice").addEventListener("click",function(){
        if(productdata.length) {
            mostrarProductos(ordmayorPrecio(productdata));
        }
    })
});

商品渲染函数mostrarProductos逻辑无问题,无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:00