Lucee/CF - 清理以逗号分隔的列表
Lucee/CF - Clean up comma delimited list
我有一个格式不一致的项目列表,我需要对其进行排序。
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 项……等等
可以trim先空格再排序。试试下面的代码
<cfset listA = "item 1, item 3.0 ,item 8 , item 1.0 , item 4, item 5, item 6, item 10">
<cfset b = arrayMap(listtoarray(listA),function(item,index,arr){return Trim(item)})>
<cfset arraySort(b,"text","asc") >
<cfdump var="#b#">
更新
这也可以使用 listMap 来完成
<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>
这是使用相同基本思想的另一种方法。循环遍历列表项并 trim 它们,然后最后排序。工作示例 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>
对于正则表达式选项,您可以使用匹配模式 \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>
我有一个格式不一致的项目列表,我需要对其进行排序。
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 项……等等
可以trim先空格再排序。试试下面的代码
<cfset listA = "item 1, item 3.0 ,item 8 , item 1.0 , item 4, item 5, item 6, item 10">
<cfset b = arrayMap(listtoarray(listA),function(item,index,arr){return Trim(item)})>
<cfset arraySort(b,"text","asc") >
<cfdump var="#b#">
更新
这也可以使用 listMap 来完成
<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>
这是使用相同基本思想的另一种方法。循环遍历列表项并 trim 它们,然后最后排序。工作示例 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>
对于正则表达式选项,您可以使用匹配模式 \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>