ColdFusionを使用して、「Price persq.ft」フィールドに基づいて多次元配列を高から低に並べ替えます。
それは生産中であり、テストで働いていました、しかし奇妙な、分類されていない結果をもたらしたケースが出てきました。また、CFDOCSサイトでコードを使用してこれをArraySort
実行したところ、同じ誤った並べ替え結果が得られました。
ご覧のとおり、結果は実際には並べ替えられていません。
これが私のコードです:
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でこれと同じコードを実行したところ、同じ間違った結果が得られました。
ソートパラメータまたはコールバックで何か間違ったことをしていますか?
ありがとうございました!
ArraySortコールバック関数は、時刻「アレイの2つの要素を比較」、および以下のいずれかの値を返さなければなりません。
-1
最初の要素が2番目の要素よりも小さい場合0
最初の要素が2番目の要素と等しい場合1
最初の要素が2番目の要素より大きい場合一方で比較()関数がリターンを行い1
、0
または-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 ;
});
..文字列の比較では、数値の比較と同じ結果が得られないことを示しています。
「価格」値を数値としてソートするには、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);
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加