2015-11-26 8 views
6

私はcoldfusionを持っています。数値とアルファベットの混合キーを含む構造数値キーリストのみを取得するColdfusion構造

数字キーのみにアクセスする必要があります。

私のコードは、このような問題を解決するためのより良い方法はあり

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

のように見えますか?

+1

、そのアプローチは罰金です。最近のバージョンのCFではより良いオプションがありますが、もしCF9でスタックされていれば、そうなるでしょう。 –

答えて

6

このような問題を解決するためのより良い方法はありますか?

私はこのようなものを使用します。

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

これは本当に便利です。 – Pankaj

4

このような問題を解決する方法はありますか?

リストの代わりに配列を使って作業することをお勧めします。

CF9では、あなたのものに似たループが得られます。何度も必要な場合は、それからユーティリティー機能を作り出すことができます。この1は、区切り文字の独立したキーのすべての種類を扱うことができるようにStructKeyList()を回避:

CF11で
<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では、このコードをどのように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> 
0

私は本当にこれで何が間違って表示されません。それはすでにうまくいくはずです。それは非常に読みやすいです。

Listで作業することは、Arrayより速いことがあります。正規表現で動作するようにも

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

可能:

0

私はこれを持っていた私は、配列ではなく、リストが、それ以外を使用すると思い

inList2 = REReplace(inList,"[^0-9.]", "","ALL"); 
関連する問題