Coldfusion 结构仅获取数字键列表

Coldfusion Struct getting only numeric key list

我有一个包含混合键数字和字母、字母数字的 coldfusion 结构

我只需要访问数字键。

我的代码看起来像

<cfset ids = structkeyList(st ) />
<cfset numericIDs = "" />
<cfloop list="#ids#" index="i">
    <cfif IsNumeric(i)>
        <cfset numericIDs = ListAppend( numericIDs , i ) />
    </cfif>
</cfloop>

有没有更好的方法解决此类问题?

Is there a better method to solve such problems?

我通常建议使用数组而不是列表。

在 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>

Is there a better method to solve such problems?

我会用这样的东西:

<cfset numericIDs = arrayToList(reMatch('\b\d+(?=,|$)\b', structKeyList(st)))>

我真的不明白这有什么问题。它应该已经很好用了,而且可读性很好。

有时使用列表比使用数组更快。

我有这个:

<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>

也可以使用正则表达式:

inList2 = REReplace(inList,"[^0-9.]", "","ALL");