在ColdFusion中对值进行排序ASC
如何通过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() />
无论哪种方式产生相同的结果。下面是结果的截图...
这里是填充选择菜单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>');
});
}
});
订货会在这里最好的解决办法:
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
不会显示链接结构的实际顺序。
* cfdump不显示链接结构的真实顺序*是的。它通常以最友好的方式显示事物。与结构,这意味着按字母顺序。 – Leigh
非常感谢你的帮助。这似乎工作,如果我在测试页上运行它 - 但在生产中,我用jquery/ajax调用组件,并返回填充选择的值。 – Bobmd
挂起,我使用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
非常感谢您的帮助。我想出了一个解决方案...通过返回一组对象。
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>
提花有人也许能够使用此一天。
LinkedHashMap将维护插入顺序。但是,这意味着您必须使用“title”值* * not * storeid来排列查询结果。 – Leigh
你是对的,那是一个错字。我按client_loc进行排序,但它仍然没有以正确的排序顺序返回到调用页面。 – Bobmd