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

时间:2019-01-10 20:44:58

标签: arrays sorting coldfusion cfml

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

它已经投入生产并在测试中工作,但是出现了一个案件,产生了奇怪的,未分类的结果。我还使用their ArraySort code在CFDOCS网站上运行了此命令,并得到了相同的,错误的排序结果。

如您所见,结果甚至没有真正排序。

这是我的代码:

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 个答案:

答案 0 :(得分:4)

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

  • case "$password" in *[^A-Z1-9]*) echo "bad password" ;; *) echo ok ;; esac ,如果第一个元素小于第二个元素
  • -1,如果第一个元素等于第二个
  • 0,如果第一个元素比第二个元素更大

虽然compare()函数确实返回了110,但它会将元素比较为 strings ,但不会产生数值的预期顺序。如Shawn建议的那样,添加一些调试代码将显示每次比较的结果:

-1

..证明字符串比较不会产生与数字比较相同的结果:

  • 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){

       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 ;
});

对于升序顺序(从低到高),只需交换比较:

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

Runnable Example

答案 1 :(得分:0)

考虑compare()函数。它可以返回-1、0或1。只有0被认为是错误的。要纠正这一点,您需要

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