2014-12-02 75 views
1

基於第一個example in this blog post,我有一個隱式結構的隱式數組。我的數據實際上是非常相似的,如:通過結構鍵對隱式結構的隱式數組排序

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

我決定以這種形式來創建數據,以便以後可以在任何一組推新報告的陣列,或者只是改寫陣列的新列表的報告,如果需要。我不知道是否有可能進行排序基於結構的「集團」鍵,這個陣列,這樣我可以通過他們循環和輸出是這樣的:

集團一

我的第一份報告

我的第三份報告

組兩個

我的第二份報告

-

這有道理嗎?或者我正在討論這個錯誤?

+0

我很好奇您的數據實際上是來自,源對象是什麼。幾乎聽起來,從你的一對評論中,像這件事情在配置文件中是一個靜態對象?如果這是一個需要排序一次的大型靜態對象,則可以使用某些類似執行的東西來創建對象的排序版本,並生成代碼的隱式排序版本。您可以在www.cflive.net上運行http://pastebin.com/5BVpKJB2中的代碼來快速生成已排序的對象。 (如果它不是靜態對象,那很酷,它就像你的描述聽起來一樣)。 – 2014-12-02 22:41:20

+0

我不確定我是否理解如何回答你的問題,但我會嘗試進一步解釋我在做什麼。 (我也無法確定我的方式是最好的方法,因爲我大多是前端開發人員。)我在/ applications/Reporting /上有一個集中的報告應用程序。我在我的服務器上的/ ClientName/Admin/Reporting /上也有許多此應用的客戶端實例。這兩個位置都有一個配置.cfm文件,用於設置基本的應用程序配置。/applications/Reporting /具有默認配置,而客戶端級別的配置只是修改或添加任何其他配置。 – Michael 2014-12-03 21:41:28

+0

...因此,在這種情況下,/ applications/Reporting /中的配置具有適用於所有客戶端的默認報告列表。但是,/ ClientOne/Admin/Reporting /中的配置文件可能會重寫整個報表陣列(),或者可能只是附加一些新的報表()在大多數情況下,我希望能夠追加只需要自定義的,而不是在每個客戶端目錄中重寫和維護那些巨大的ReportsArray,因此在這種情況下,數組並不總是按照字母順序排列, – Michael 2014-12-03 21:46:11

回答

5

也許Query會是正確工作的正確數據類型?使用ColdFusion着名的查詢查詢,像這樣排序數據是小菜一碟。

如果你真的想排序一個對象數組,並且你在CF10 +中,那麼你很幸運。您可以使用帶回調的ArraySort:https://wikidocs.adobe.com/wiki/display/coldfusionen/ArraySort

如果你堅持,這裏有一個簡單的排序閱讀泡沫,將在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)#"> 

運行在這裏:http://www.trycf.com/scratch-pad/pastebin?id=RuSHgZYq

+0

感謝您的建議,我真正需要的是可以覆蓋或修改的人類可讀數據集合,因此如果我可以使用QueryNew來完成這項工作(這就是您我的開發者服務器是CF10,但是我的生產服務器是CF8,我還沒有使用過QueryNew,但是希望CF8不會是一個巨大的痛苦, – Michael 2014-12-02 20:07:06

+1

這是不錯,再加上1.這種讓我想知道數據究竟來自哪裏。@邁克爾什麼是酸味對於你給我們一個樣本數據來處理這些數據是非常棒的,但實際上這些數據的來源是什麼?顯然,它不是一個靜態對象。 – 2014-12-02 20:14:53

+0

我同意Q的Q是一個很好的工具。它不會比由cfqueryparam提供的循環更差 - 並且會給你更清晰的代碼。只是我的觀點。像cfqueryparam一樣,我想知道你的數據來自哪裏?你把它存儲在code_中,或者從mongo或者couchbase中存儲爲json?它似乎像表格數據給我。 – 2014-12-02 20:32:21

4

有一個quicksort() function on CFLib這需要一個比較回調,只是用它來排序你的數組。

你需要寫的比較器功能,但它只是這個:

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