如何从Coldfusion数组中删除重复的值?

| 我有一个接收一串标签的函数。为了单独保存标签,该函数将字符串转换为数组:
this.tags = listToArray(this.tags, \", \");
如果有重复值,我该如何删除?     
已邀请:
从列表中删除重复项的一种简单方法是先将列表转换为结构,然后将结构转换为数组。但是,如果列表中项目的顺序很重要,则这可能不合适,因为该结构中的元素将被排序。 如果项的顺序很重要,则需要手动构建数组,而不是使用listToArray功能。
<!--- CF9 --->
<cfset tags = \"apples,oranges,bananas,pears,APPLES\" />
<cfset tagArray = arrayNew(1) />

<cfloop list=\"#tags#\" index=\"tag\" delimiters=\",\">
    <cfif not ArrayFindNoCase(tagArray,tag)>
        <cfset arrayAppend(tagArray, tag) />
    </cfif>
</cfloop>
    
我喜欢将Java用于此类任务:
<cfset tags = \"apples,oranges,bananas,pears,apples\" />

<cfset tagsArray = createObject(\"java\", \"java.util.HashSet\").init(ListToArray(tags)).toArray() />

<cfdump var=\"#tags#\" />
<cfdump var=\"#tagsArray#\" />
唯一的问题是要考虑到大小写,因此认为\“ apples \”和\\“ APPLES \”是不同的东西(从技术上讲,是的,取决于您的系统可能会有所不同)。解决方法是先将列表中的所有内容都小写。     
由于您实际上是从要转换为数组的字符串/列表开始的,因此可以先将字符串通过ListRemoveDuplicates传递,然后再将其转换为数组。 ListRemoveDuplicates在Coldfusion 10中引入;输入参数为(列表,定界符= \“,\”,ignoreCase = FALSE)。
this.tags = listToArray(listRemoveDuplicates(arrayInput,\", \",TRUE));
如果实际上是从数组开始的,则需要先将其转换为列表,然后再转换为列表。
this.tags = listToArray(listRemoveDuplicates(arrayToList(arrayInput),\", \",TRUE) );
    
基于Jason Haritou的想法,但是您可以使用Struct在纯CF中做到这一点! (键匹配将不区分大小写)
this.tags = listToArray(this.tags, \", \");
var tmpStruct = {};

for (var t in this.tags)
    tmpStruct[t] = \"\";

return structKeyArray(tmpStruct);
但是,对于小型列表,我更喜欢安东尼的解决方案。     
我只需要去重复一个非常大的列表(5k个以上的条目),发现比使用循环快得多的方法。我觉得有必要分享。 将列表转换为数组(您已经有了数组,所以跳过)
<cfset thisArray = ListToArray(thisList)>
使用queryNew(\“ \”)
<cfset thisQuery = QueryNew(\"\")>
创建查询 使用步骤1
<cfset temp = QueryAddColumn(thisQuery,\"items\",\"varChar\",thisArray)>
中的数组向该查询添加列 查询不同的值ѭ9 将结果转换为清单
<cfset returnString = ValueList(qItems.items)>
这是您轻松将此列表转换回数组的简单步骤 我将此编写为易于使用的函数:
<cffunction name=\"deDupList\" output=\"no\" returntype=\"string\">
    <cfargument name=\"thisList\" required=\"yes\">
    <cfargument name=\"thisDelimeter\" required=\"yes\" default=\",\">
    <cfset var loc = StructNew()>

    <cfset loc.thisArray = ListToArray(thisList,thisDelimeter)>
    <cfset loc.thisQuery = QueryNew(\"\")>
    <cfset loc.temp = QueryAddColumn(loc.thisQuery,\"items\",\"varChar\",loc.thisArray)>
    <cfquery name=\"qItems\" dbtype=\"query\">
        SELECT DISTINCT items FROM loc.thisQuery
    </cfquery>
    <cfset loc.returnString = ValueList(qItems.items)>
    <cfreturn loc.returnString>
</cffunction>
我将其标记为其他几种方法,以下是毫秒数的结果: 循环检查> 1个实例的列表:6265 使用亨利的struct方法:2969 上面的方法:31 杰森的方法:30     
只需将数组放入Struct,然后将其复制回数组即可;) http://www.bennadel.com/blog/432-Using-ColdFusion-Structures-To-Remove-Duplicate-List-Values.htm     
将jason的答案再进一步一点,这是一个
arrayDistinct
函数。
function arrayDistinct (required array data) {
    var output = arrayNew(1);
    output.addAll(createObject(\"java\", \"java.util.HashSet\").init(arguments.data));
    return output;
}
您可以在这里进行测试:https://trycf.com/gist/62ff904d4500519e3144fc9564d2bce7/acf     
在CFLib上有几个UDF可以做到这一点,ArrayyDiff(http://www.cflib.org/udf/arrayDiff)和ArrayCompare(http://www.cflib.org/udf/arrayCompare)。 hth, 拉里     
在Coldfusion 10或Railo 4中,可以使用Underscore.cfc \的uniq()函数:
_ = new Underscore();

uniqueArray = _.uniq(arrayWithDuplicates);
“ 15”的一个优点是,如有必要,它允许您传递转换函数。 注意:我写了Underscore.cfc     

要回复问题请先登录注册