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

Reply via email to