Lucee / CF - 清理逗号分隔列表

时间:2018-02-22 04:31:45

标签: list coldfusion lucee

我有一个项目列表,这些项目的格式不一致,我需要排序。

item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10

基本上,一些项目可以在逗号(,)之前或之后有空格(多个偶数)。

我尝试listtoarray然后排序,但我发现排序保留了空格,使得第1项和第1.0项无法正确排序。我以为我可以使用listtoarray删除空格,但也许我正在考虑一个不同的函数,或者我需要通过循环遍历我的列表?

有人可以在这个基本任务上刷新我的记忆吗?

已更新 预期结果应为:

第1项,第10项,第3.0项,第4项,第5项,第6项,......等

3 个答案:

答案 0 :(得分:8)

您可以先剪裁空格然后再排序。请尝试以下代码

<cfscript>
    myList="item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10";
    myList=ListMap(myList,function(item){return Trim(item);});
    myList = listSort(myList, "textnocase", "asc");     
    writeOutput(myList);
</cfscript>

enter image description here

更新

这可以使用listMap来完成

+----+---------+---------------+--------+------------+
| id | item_id | property_name | value  | timestamp  |
+----+---------+---------------+--------+------------+
|  1 |       1 | color         | blue   | 2018-01-01 |
|  2 |       1 | size          | large  | 2018-01-01 |
|  3 |       1 | weight        | 65     | 2018-01-01 |
<SNIP>
| 15 |       1 | color         | purple | 2018-02-01 |
| 16 |       1 | weight        | 69     | 2018-02-01 |
+----+---------+---------------+--------+------------|

答案 1 :(得分:3)

对于正则表达式选项,您可以使用匹配模式\s*,\s*。此模式读取为匹配任何,之前有0个或更多空白字符,之后有0个或更多空格字符。然后,我们可以使用reReplace将这些匹配替换为不带空格的,

<cfscript>
    myList="item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10";
    myList = reReplace(trim(myList), "\s*,\s*", ",", "all");
    myList = listSort(myList, "textnocase", "asc");
    writeOutput(myList);
</cfscript>

TryCF.com example
regex101.com example

答案 2 :(得分:2)

这是使用相同基本思想的另一种方式。循环遍历列表项并修剪它们,然后最终排序。工作示例here

<cfscript>
    myList = "item 1,  item 3.0   ,item 8    ,    item 1.0 , item 4, item 5, item 6, item 10";

    i = 1;
    for (item in myList) {
        myList = listSetAt(myList, i, trim(item));
        i++;
    }

    myList = listSort(myList, "textnocase", "asc");    

    writeOutput(myList);
</cfscript>