Sorting an implicit array of implicit structs by struct key

最后都变了- 提交于 2019-12-11 11:16:28

问题


Based on the first example in this blog post, I have an implicit array of implicit structs. My data is actually pretty similar, e.g.:

<cfset ReportsArray = [
  {
    Name = "My First Report",
    Group = "Group One"
  },
  {
    Name = "My Second Report",
    Group = "Group Two"
  },
  {
    Name = "My Third Report"
    Group = "Group One"
  },
  ...etc...
]>

I decided to create the data in this format so that I can later push a new report to the array in any group, or just rewrite the array with a new list of reports if needed. I'm wondering if it's possible to sort this array based on the "Group" key in the structs so that I can loop through them and output something like this:

Group One

My First Report

My Third Report

Group Two

My Second Report

--

Does that make sense? Or am I going about this wrong?


回答1:


Maybe Query would be the right data type for the right job? with ColdFusion's famous Query of Queries, sorting data like this is a piece of cake.

If you really want to sort an array of objects, and you're in CF10+, you are in luck. You may use ArraySort with callback: https://wikidocs.adobe.com/wiki/display/coldfusionen/ArraySort.

If you insist, here's a easy to read bubble sort that would work in CF8:

<cfscript>

    function sortReports(reports) 
    {
        var local = {};

        local.sorted = false;
        local.reportSize = arrayLen(reports);

        while (!local.sorted) 
        {
            local.sorted = true;
            for (local.i = 1; local.i < local.reportSize ; local.i = local.i + 1) 
            {
                local.report1 = reports[local.i];
                local.report2 = reports[local.i + 1];

                if (local.report1.group > local.report2.group)
                {
                    arraySwap(reports, local.i, local.i + 1);
                    local.sorted = false;
                }
            }
        }

        return reports;
    }

reportsArray = [
  {
    Name = "My First Report",
    Group = "Group One"
  },
  {
    Name = "My Second Report",
    Group = "Group Two"
  },
  {
    Name = "My Third Report",
    Group = "Group One"
  }
];
</cfscript>
<cfdump var="#sortReports(reportsArray)#">

Run it here: http://www.trycf.com/scratch-pad/pastebin?id=RuSHgZYq




回答2:


There's a quicksort() function on CFLib which takes a comparator callback, just use that to sort your array.

You'll need to write the comparator function, but it's just this:

function reportComparator(e1, e2){
    return compare(e1.group, e2.group);
}


来源:https://stackoverflow.com/questions/27257162/sorting-an-implicit-array-of-implicit-structs-by-struct-key

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!