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

The ArraySort callback is not sorting my array in the correct order

使用 ColdFusion 根据 "Price per sq. ft" 字段从高到低对多维数组进行排序。

它已投入生产并进行测试,但出现了一个案例,产生了 st运行ge,未分类的结果。我也在 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 上使用了相同的代码,但得到了相同的错误结果。

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

谢谢!

考虑 compare() 函数。它可以 return -1、0 或 1。只有 0 被认为是假的。要更正此问题,您需要

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

ArraySort callback function"compares two elements of the array"一次,并且应该return以下值之一:

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

虽然 compare() 函数执行 return 10-1,但它将元素作为 strings,这不会产生预期的数值顺序。正如 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 ;
});

.. 表明 string 比较不会产生与数字比较相同的结果:

  • 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

要将 "price" 值排序为数字,请使用 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

正如@SOS 所提到的,compare() 函数似乎将数字作为字符串进行比较,即使您将它们包装在 val() 中也是如此。但是他用三元的地方,你也可以用sgn()函数代替

例如...

// ascending order
arraySort(figures, function (a, b){
   return sgn(a.price - b.price);
});

// .. or for descending order
arraySort(figures, function (a, b){
   return sgn(b.price - a.price);
});

sgn() 函数将始终 return 正数为 1,负数为 -1,零为 0...使其成为此用例的完美函数(恕我直言) .