2016-11-23 77 views
1

如何通過ASC順序中的值對此結構進行排序?在ColdFusion中對值進行排序ASC

<cfset dStruct = createObject("java", "java.util.LinkedHashMap").init()> 
<cfquery name="gds" datasource="#application.dsn#"> 
    SELECT * FROM stores WHERE region_id = #arguments.retailer_id# 
    ORDER BY client_loc ASC 
</cfquery> 

<cfoutput query="gds"> 
    <cfset var dStru = { "#gds.storeid#" = "#gds.client_loc# - #gds.city#, #gds.state#" }> 
    <cfset StructAppend(dStruct, dStru)> 
</cfoutput> 

<cfset StructSort(dStruct,"textnocase","asc")> 
.... 
<cfreturn SerializeJSON(dStruct) /> 

結果然後填充一個下拉列表。下面是結果:

struct 
299 | ASH041 - ONTARIO, CA 
300 | ASH042 - CLEARWATER, FL 
301 | ASH044 - TAMPA, FL 
302 | ASH046 - ORLANDO, FL 
303 | ASH047 - SARASOTA, FL 
304 | ASH048 - TAMPA, FL 
305 | ASH002 - HUNTINGTON STN., NY 

如果它被正確分類,ASH002將是第一個結果,但它似乎是在KEY,而不是價值排序。有沒有辦法按值排序?

我也試過這個...

<cfset dStruct = createObject("java", "java.util.LinkedHashMap").init() /> 

無論哪種方式產生相同的結果。下面是結果的截圖...

screenshot

這裏是填充選擇菜單jquery的。您的SQL語句中

 $.ajax({ 
      url: "/functions.cfc", 
      cache: false, 
      type: "get", 
      dataType: "json", 
      data: {method: "getstoresbyretailer", retailer_id: (retailer_id)}, //get stores 
      success: function (data) { 

       var $select = $('#storeid'); 
       $select.find('option').remove(); 

       $.each(data,function(key, value) { 
        $select.append('<option value=' + key + '>' + value + '</option>'); 
       }); 

      } 
     }); 
+1

LinkedHashMap將維護插入順序。但是,這意味着您必須使用「title」值* * not * storeid來排列查詢結果。 – Leigh

+0

你是對的,那是一個錯字。我按client_loc進行排序,但它仍然沒有以正確的排序順序返回到調用頁面。 – Bobmd

回答

3

訂貨會在這裏最好的解決辦法:

ORDER BY storeid, client_loc, city, state

,然後遍歷您的查詢和生成的選項。


但是,爲了回答你的問題:

如果要排序的未連接結構(dStruct),並保持一個有序的結構,你必須使用一個連接結構(LinkedHashMap):

<cfset sortedKeys = structSort(dStruct, "textnocase", "asc")> 
<cfset sortedStruct = createObject("java", "java.util.LinkedHashMap").init()> 

<cfloop array="#sortedKeys#" index="key"> 
    <cfset sortedStruct[key] = dStruct[key]> 
</cfloop> 

<cfoutput> 

    <select> 
     <cfloop collection="#sortedStruct#" item="key"> 
      <option>#encodeForHtml(sortedStruct[key])#</option> 
     </cfloop> 
    </select> 

</cfoutput> 

請注意,使用cfdump不會顯示鏈接結構的實際順序。

+0

* cfdump不顯示鏈接結構的真實順序*是的。它通常以最友好的方式顯示事物。與結構,這意味着按字母順序。 – Leigh

+0

非常感謝你的幫助。這似乎工作,如果我在測試頁上運行它 - 但在生產中,我用jquery/ajax調用組件,並返回填充選擇的值。 – Bobmd

+0

掛起,我使用HashMap取得了一些進展。返回的json的順序是正確的,但是選擇菜單仍然是打開的。是什麼原因造成的? {「305」:「ASH002 - HUNTINGTON STN。,NY「,」310「:」ASH003 - CARLE PLACE,NY「,」318「:」ASH004-森林山,紐約州「,」322「:」ASH005-布魯克林,紐約州「,」323「:」ASH006-白色PLAINS,NY「,」324「:」ASH007 - NEW YORK,NY「} – Bobmd

1

非常感謝您的幫助。我想出了一個解決方案...通過返回一組對象。

function getstoresbyretailer(retailer_id) { 

$.ajax({ 
    url: "/functions.cfc", 
    cache: false, 
    type: "get", 
    dataType: "json", 
    data: {method: "getstoresbyretailer", retailer_id: (retailer_id)}, 
    success: function (data) { 

     var $select = $('#storeid'); 
     $select.find('option').remove(); 

     $.each(data, function(key, value) { 
      $select.append('<option value=' + value.storeid + '>' + value.store + '</option>'); 
     }); 
    } 
}); 
} 

而且ColdFusion的功能...

<cffunction name="getstoresbyretailer" access="remote" returnformat="json" output="no"> 
    <cfargument name="retailer_id" type="numeric" required="yes"> 

    <cfset var dArray = []> 
    <cfif arguments.retailer_id neq 0> 

     <cfquery name="gds" datasource="#application.dsn#"> 
      SELECT * FROM stores WHERE region_id = #arguments.retailer_id# 
      ORDER BY client_loc ASC 
     </cfquery> 

     <cfif gds.recordcount> 

      <cfoutput query="gds"> 
       <cfset dStru = { "storeid" = "#gds.storeid#", "store" = "#gds.client_loc# - #gds.city#, #gds.state#" }> 
       <cfset ArrayAppend(dArray, dStru)> 
      </cfoutput> 

     </cfif> 

    </cfif> 

    <cfreturn SerializeJSON(dArray) /> 
</cffunction> 

提花有人也許能夠使用此一天。