使用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上运行了相同的代码,并得到了相同的错误结果。
我在排序参数或回调中做错了什么吗?
谢谢!
答案 0 :(得分:4)
ArraySort callback function一次“比较数组的两个元素”,并且应返回以下值之一:
case "$password" in
*[^A-Z1-9]*) echo "bad password" ;;
*) echo ok ;;
esac
,如果第一个元素小于第二个元素 -1
,如果第一个元素等于第二个0
,如果第一个元素比第二个元素更大 虽然compare()函数确实返回了1
,1
或0
,但它会将元素比较为 strings ,但不会产生数值的预期顺序。如Shawn建议的那样,添加一些调试代码将显示每次比较的结果:
-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);
});
答案 1 :(得分:0)
考虑compare()
函数。它可以返回-1、0或1。只有0被认为是错误的。要纠正这一点,您需要
arraySort(figures, function (a, b){
return compare(b.price, a.price) == 1 ? 1 : 0;
});
writeDump(figures);