代码之家  ›  专栏  ›  技术社区  ›  Tass Times

arraysort回调未按正确顺序对数组进行排序

  •  4
  • Tass Times  · 技术社区  · 6 年前

    使用ColdFusion根据“每平方英尺价格”字段从高到低对多维数组进行排序。

    它已经投入生产并在测试中工作,但是一个案例已经出现,产生了奇怪的、未排序的结果。我也在cfdocs网站上用 their ArraySort code 得到了同样的,不正确的排序结果。

    正如您所看到的,结果甚至没有真正排序。

    以下是我的代码:

    figures = [
       {name='carl',price='117.5'},
       {name='fen',price='116.4'},
       {name='joe',price='86.3'}
    ];
    
    arraySort(figures, function (a, b){
       return compare(b.price, a.price);
    });
    writeDump(figures);
    

    结果:

    NAME    joe
    PRICE   86.3
    
    NAME    carl
    PRICE   117.5
    
    NAME    fen
    PRICE   116.4
    

    应按以下顺序排序:117.5、116.4、86.3。

    我相信它的排序方式 86.3 看起来比其他的更大,因为它以8开头?我也试过不带引号,也得到了错误的结果。

    我在cfdocs.org上运行了同样的代码,得到了同样的错误结果。

    我在排序参数或回调中是否做了错误的操作?

    谢谢您!

    2 回复  |  直到 6 年前
        1
  •  4
  •   SOS    6 年前

    这个 ArraySort callback function “一次比较数组的两个元素”,并应返回以下值之一:

    • -1 如果第一个元素是 小于 第二
    • 0 如果第一个元素是 等于 第二
    • 1 如果第一个元素是 大于 第二

    compare() 函数不返回 , - 1 ,它将元素比较为 ,它不会生成数值的预期顺序。正如Shawn建议的那样,添加一些调试代码将显示每个比较的结果:

    arraySort(figures, function (a, b){
    
           local.num = compare(a.price, b.price);
           local.text = local.num == -1 ? " less than " : (local.num == 0 ? " equals " : " greater than");
           writeOutput("<br> "& a.price &" "& local.text &" "& b.price &" => "& local.num );
    
           return local.num ;
    });
    

    …证明了 一串 比较不会产生与数值比较相同的结果:

    • 116.4小于117.5=>-1
    • 86.3大于116.4=>1
    • 86.3大于117.5=>1
    • 1117.3小于117.5=>-1
    • 1117.3小于116.4=>-1

    要将“价格”值排序为数字,请使用 arithmetic operators 而不是compare()。为了 下降的 顺序(从高到低):

    arraySort(figures, function (a, b){
       return (b.price < a.price) ? -1 : (b.price == a.price ? 0 : 1);
    });
    

    为了 提升 顺序(从低到高),只需交换比较:

    arraySort(figures, function (a, b){
       return (a.price < b.price) ? -1 : (a.price == b.price ? 0 : 1);
    });
    

    Runnable Example

        2
  •  0
  •   James A Mohler    6 年前

    考虑一下 compare() 功能。它可以返回-1、0或1。只有0被认为是错误的。要纠正这个问题,你需要

     arraySort(figures, function (a, b){
      return compare(b.price, a.price) == 1 ? 1 : 0;     
     });
     writeDump(figures);