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 上运行了相同的代码并得到了相同的错误结果。
我是否在排序参数或回调中做错了什么?
谢谢!
所述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)
.. 证明字符串比较不会产生与数字比较相同的结果:
要将“价格”值排序为数字,请使用算术运算符而不是 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)
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |