在Coldfusion中按自定义顺序排序数组

时间:2014-07-30 23:45:30

标签: arrays sorting coldfusion

我有一系列可以变化的产品尺寸。

有些情况会是。

08
10
12
16
18
S
M
L
XL
XXL

我似乎能够轻松地对数值的数组进行排序,但是当大小调整也包含它时,我似乎也不能按字母顺序对它们进行排序

实施例 它最终成为

L
M
S
XL
XXL

技术上说,这对于字母顺序是正确的,但是对于人类的顺序应该是

S
M
L
XL
XXL

有人知道使用Coldfusion的方法吗?我目前正在使用CF 8,并且到处寻找排序,但似乎无法找到如何做到这一点

2 个答案:

答案 0 :(得分:3)

如果你正在使用CF10 +,那么你很幸运!

https://wikidocs.adobe.com/wiki/display/coldfusionen/ArraySort

实现您自己的回调函数,自行对您的集合进行排序,例如:

<cfscript>
    function sortSize(array sizes) 
    {
        var sizeOrder = "XXS,XS,S,M,L,XL,XXL";    // your sort order

        arraySort(sizes, function(s1, s2) {
            return listFindNoCase(sizeOrder,s1) - listFindNoCase(sizeOrder,s2);
        });

        return sizes;
    }
</cfscript>

在TryCF上运行上面的代码:http://www.trycf.com/scratch-pad/pastebin?id=pb1rn6CT

更新:但由于您使用的是CF8,因此您可以实施自己的冒泡排序并尝试:

<cfscript>
    function sortSize(input) 
    {
        var local = {};

        local.sizes = "XXS,XS,S,M,L,XL,XXL";    // your sort order
        local.sorted = false;
        local.inputSize = arrayLen(input);

        while (!local.sorted) 
        {
            local.sorted = true;
            for (local.i = 1; local.i < local.inputSize; local.i = local.i + 1) 
            {
                local.size1 = listFindNoCase(local.sizes, input[local.i]);
                local.size2 = listFindNoCase(local.sizes, input[local.i + 1]);

                if (local.size1 > local.size2)
                {
                    arraySwap(input, local.i, local.i + 1);
                    local.sorted = false;
                }
            }
        }

        return input;
    }
</cfscript>
<cfdump var="#sortSize(listToArray('l,M,M,s,XL,Xs'))#">

在TryCF上运行上面的代码:http://www.trycf.com/scratch-pad/pastebin?id=uL7r9Uyf

答案 1 :(得分:3)

就个人而言,我不想再回过头来搞清楚泡泡,合并或任何其他排序算法。我可能会采取以下步骤:

  1. 使用数字列设置所有可能大小的数据库表,以用于某种排序条件。
  2. 在应用程序级别单例中缓存或创建该查询
  3. 创建一个UDF,使用CF8版本的QueryNew及其附属功能将您的数组转换为查询。
  4. 查询将排序后的大小加入未排序数组并按排序顺序排序的查询
  5. 确保您执行left join并确保捕获不适合原始表的大小,以便您可以错误地,报告或随机化任何不匹配的数据。
  6. 将整个过程封装到UDF或应用程序作用域单例的方法中,以便重复调用。