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

时间:2011-05-26 02:54:08

标签: arrays coldfusion duplicates

我有一个接收一串标签的函数。为了单独保存标记,该函数将字符串转换为数组:

this.tags = listToArray(this.tags, ", ");

如果有任何?

,如何删除重复值

9 个答案:

答案 0 :(得分:17)

我喜欢使用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#" />

唯一的问题是它需要考虑案例,所以认为“苹果”和&amp; “APPLES”是不同的东西(技术上是肯定的,取决于你的系统可能会有所不同)。方法是首先降低列表中的所有内容。

答案 1 :(得分:9)

从列表中删除重复项的简单方法是首先将列表转换为结构,然后将结构转换为数组。但是,如果列表中的项目顺序很重要,则可能不合适,因为结构中的元素将被排序。

如果项目的顺序很重要,则需要手动构建数组,而不是使用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>

答案 2 :(得分:4)

由于您实际上是从一个字符串/列表开始,然后转换为数组,因此您可以在转换为数组之前将字符串传递给ListRemoveDuplicates。 ListRemoveDuplicates是在Coldfusion 10中引入的;输入参数是(list,delimiter =“,”,ignoreCase = FALSE)。

this.tags = listToArray(listRemoveDuplicates(arrayInput,", ",TRUE));

如果您实际上是从数组开始,则需要先将其转换为列表,然后再将其转换回来。

this.tags = listToArray(listRemoveDuplicates(arrayToList(arrayInput),", ",TRUE) );

答案 3 :(得分:2)

基于Jason Haritou的想法,但你可以使用Struct在纯CF中做到这一点! (密钥匹配将不区分大小写)

this.tags = listToArray(this.tags, ", ");
var tmpStruct = {};

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

return structKeyArray(tmpStruct);

但是,对于小型列表,我更喜欢Antony的解决方案。

答案 4 :(得分:2)

我只需要删除一个非常大的列表(5k +条目)并找到比使用循环更快的方法。我觉得有必要分享。

  1. 将列表转换为数组(您已经有数组,因此请跳过)<cfset thisArray = ListToArray(thisList)>
  2. 使用queryNew(“”)<cfset thisQuery = QueryNew("")>
  3. 创建查询
  4. 使用步骤1 <cfset temp = QueryAddColumn(thisQuery,"items","varChar",thisArray)>
  5. 中的数组向该查询添加列
  6. 查询不同的值<cfquery name="qItems" dbtype="query">SELECT DISTINCT items FROM thisQuery</cfquery>
  7. 将结果转换为列表<cfset returnString = ValueList(qItems.items)>
  8. 将此列表转换回数组
  9. 是一个简单的步骤

    我把它写成一个易于使用的函数:

    <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>
    

    我用其他一些方法对它进行了标记,这是以毫秒为单位的结果:
    循环列表检查&gt; 1个实例:6265
    使用亨利的结构方法:2969
    以上方法:31
    杰森的方法:30

答案 5 :(得分:1)

只需将数组放入Struct中,然后将其复制回数组;)

http://www.bennadel.com/blog/432-Using-ColdFusion-Structures-To-Remove-Duplicate-List-Values.htm

答案 6 :(得分:1)

在Coldfusion 10或Railo 4中,您可以使用Underscore.cfc's uniq() function

_ = new Underscore();

uniqueArray = _.uniq(arrayWithDuplicates);

uniq()的一个优点是,它允许您在必要时传递转换函数。

注意:我写了Underscore.cfc

答案 7 :(得分:1)

再过一点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

答案 8 :(得分:0)

CFLib上有几个这样做的UDF,ArrayyDiff(http://www.cflib.org/udf/arrayDiff)和ArrayCompare(http://www.cflib.org/udf/arrayCompare)。 / p>

HTH, 拉里