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

Tas*_*mes 4 arrays sorting coldfusion cfml

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

它一直在生产中并在测试中工作,但出现了一个案例,产生了奇怪的、未排序的结果。我还使用他们的ArraySort代码在 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);
Run Code Online (Sandbox Code Playgroud)

结果:

NAME    joe
PRICE   86.3

NAME    carl
PRICE   117.5

NAME    fen
PRICE   116.4
Run Code Online (Sandbox Code Playgroud)

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

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

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

我是否在排序参数或回调中做错了什么?

谢谢!

Age*_*eax 5

所述ArraySort回调函数“比较阵列的两个元件”的时间,并应返回下列值之一:

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

虽然compare()函数确实返回1, 0or -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 ;
});
Run Code Online (Sandbox Code Playgroud)

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

  • 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

要将“价格”值排序为数字,请使用算术运算符而不是 compare()。对于降序(从高到低):

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

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

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

可运行示例