我有一个coldfusion Struct,包含数字和字母混合键,字母数字
我只需要访问数字键。
我的代码看起来像
<cfset ids = structkeyList(st ) />
<cfset numericIDs = "" />
<cfloop list="#ids#" index="i">
<cfif IsNumeric(i)>
<cfset numericIDs = ListAppend( numericIDs , i ) />
</cfif>
</cfloop>
有没有更好的方法来解决这些问题?
答案 0 :(得分:6)
有没有更好的方法来解决这些问题?
我会用这样的东西:
/list
答案 1 :(得分:4)
有没有更好的方法来解决这些问题?
我通常建议使用数组而不是列表。
在CF9中,类似于你的循环就像它一样好。如果您不止一次需要,可以使用它来创建实用程序功能。这个避免StructKeyList()
能够处理各种键,独立于分隔符:
<cfscript>
function GetNumericKeys(struct) {
var keys = struct.keys();
var result = ArrayNew(1);
var key = "";
while (keys.hasNext()) {
key = keys.next();
if (IsNumeric(key)) ArrayAppend(result, key);
}
return result;
}
</cfscript>
和
<cfset nkeys = GetNumericKeys(st)>
在CF11中,您可以获得更复杂的功能(在CF11上测试,无法说明CF10如何处理此代码)。
<cfscript>
numericIDs = arrayFilter(structKeyArray(st), function (key) {
return IsNumeric(key);
});
</cfscript>
要确保整数键,请使用:
<cfscript>
numericIDs = arrayFilter(structKeyArray(st), function (key) {
return Int(key) eq key;
});
</cfscript>
答案 2 :(得分:0)
我真的不明白这有什么问题。它应该已经很好用,并且非常易读。
有时使用List比使用List更快。
答案 3 :(得分:0)
我有这个:
strtol()
也可以使用正则表达式:
<cfscript> function ListNumeric(principal) {
a=principal;
cleanlist = ''; for (i=1; i <= ListLen(a);i=i+1) { if(IsNumeric(ListGetAt(a,i))){ cleanlist = ListAppend(cleanlist,ListGetAt(a,i)); } } Return cleanlist; } </cfscript>