Sådan sorteres en række strukturer i ColdFusion

How Sort An Array Structs Coldfusion



Løsning:

Her er noget, der ligner originalenStructSort (). Det understøtter ogsåpathToSubElement -argument.

   

Usage / test:



 arr = ArrayNew(1); for (i = 1; i lte 5; i = i + 1) { s = StructNew(); s.a.b = 6 - i; ArrayAppend(arr, s); } 

Result:



ArrayOfStructSort Result




As usual, CFLib.org has exactly what you want.

http://cflib.org/udf/ArrayOfStructsSort

/** * Sorts an array of structures based on a key in the structures. * * @param aofS Array of structures. * @param key Key to sort by. * @param sortOrder Order to sort by, asc or desc. * @param sortType Text, textnocase, or numeric. * @param delim Delimiter used for temporary data storage. Must not exist in data. Defaults to a period. * @return Returns a sorted array. * @author Nathan Dintenfass ( [email protected] ) * @version 1, December 10, 2001 */ function arrayOfStructsSort(aOfS,key){ //by default we'll use an ascending sort var sortOrder = 'asc'; //by default, we'll use a textnocase sort var sortType = 'textnocase'; //by default, use ascii character 30 as the delim var delim = '.'; //make an array to hold the sort stuff var sortArray = arraynew(1); //make an array to return var returnArray = arraynew(1); //grab the number of elements in the array (used in the loops) var count = arrayLen(aOfS); //make a variable to use in the loop var ii = 1; //if there is a 3rd argument, set the sortOrder if(arraylen(arguments) GT 2) sortOrder = arguments[3]; //if there is a 4th argument, set the sortType if(arraylen(arguments) GT 3) sortType = arguments[4]; //if there is a 5th argument, set the delim if(arraylen(arguments) GT 4) delim = arguments[5]; //loop over the array of structs, building the sortArray for(ii = 1; ii lte count; ii = ii + 1) sortArray[ii] = aOfS[ii][key] & delim & ii; //now sort the array arraySort(sortArray,sortType,sortOrder); //now build the return array for(ii = 1; ii lte count; ii = ii + 1) returnArray[ii] = aOfS[listLast(sortArray[ii],delim)]; //return the array return returnArray; }   

The accepted solution (from CFLib.org) is NOT safe. I experimented with this for something I needed to do at work and found that it returns incorrect results when sorting numeric with floats.



For example if I have these structs: (pseudocode)

 a = ArrayNew(1); s = StructNew(); s.name = 'orange'; s.weight = 200; ArrayAppend(a, s); s = StructNew(); s.name = 'strawberry'; s.weight = 28; ArrayAppend(a, s); s = StructNew(); s.name = 'banana'; s.weight = 90.55; ArrayAppend(a, s); sorted_array = arrayOfStructsSort(a, 'weight', 'asc', 'numeric');  

Iterere over det sorterede array og udskrive navn og vægt. Det vil ikke være i den rigtige rækkefølge, og dette er en begrænsning for at blande en vilkårlig nøgle med værdien, der sorteres.