After running some tests on a list of 10,000 items with 200 distinct items the
QofQ option ran about 30% more efficiently than looping over the list/Array.
This is even when converting the query object back to a list.
For reference purposes these are the two code samples.
<!--- create the list --->
<cfset thisList="">
<cfloop from="1" to="100" index="i">
<cfset thisList=thisList & i & ",">
<cfloop from="1" to="100" index="j">
<cfset thisList=thisList & j+i & ",">
</cfloop>
</cfloop>
<!--- option A --->
<cfscript>
function ListDeleteDuplicates(list) {
var i = 1;
var delimiter = ',';
var returnValue = '';
if(ArrayLen(arguments) GTE 2)
delimiter = arguments[2];
list = ListToArray(list, delimiter);
for(i = 1; i LTE ArrayLen(list); i = i + 1)
if(NOT ListFind(returnValue, list[i], delimiter))
returnValue = ListAppend(returnValue, list[i], delimiter);
return returnValue;
}
</cfscript>
<cfset newList=ListDeleteDuplicates(thisList)>
<!--- option B --->
<cffunction name="removeDuplicates">
<cfargument name="list" required="Yes" />
<cfscript>
var qList = queryNew("");
var qColumn = listToArray(arguments.list);
var qReturn = "";
queryAddColumn(qList, "list", qColumn);
</cfscript>
<cfquery dbtype="query" name="qReturn">
SELECT DISTINCT(list) AS listItem
FROM qList
</cfquery>
<cfset returnList="">
<cfloop query="qReturn">
<cfset returnList=returnlist & listItem & ",">
</cfloop>
<cfreturn returnList />
</cffunction>
<cfset newList=removeDuplicates(thisList)>
Jason Sheedy
Senior Web Developer
Voice International Limited
www.voice.com.au