2015-11-26 5 views
6

Ich habe eine Coldfusion Struct enthält Mix Tasten numerische und alpha, alphanumerische ZeichenColdfusion Struct nur numerische Tastenliste bekommen

ich nur die numerischen Tasten zugreifen müssen.

Mein Code sieht aus wie

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

Gibt es eine bessere Methode, solche Probleme zu lösen?

+1

ich eher einen Array verwenden würde, als eine Liste, aber abgesehen davon, dass Ansatz scheint in Ordnung. Es gibt bessere Möglichkeiten mit neueren Versionen von CF, aber wenn Sie auf CF9 stecken, so sei es. –

Antwort

6

Gibt es eine bessere Methode, solche Probleme zu lösen?

würde ich so etwas wie folgt verwenden:

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

Dieser ist wirklich praktisch. – Pankaj

4

Gibt es eine bessere Methode, um solche Probleme zu lösen?

Ich würde generell empfehlen, mit Arrays statt Listen zu arbeiten.

In CF9 ist eine Schleife ähnlich wie Ihre ist so gut wie es geht. Sie können eine Dienstprogrammfunktion daraus machen, wenn Sie sie mehrmals benötigen. Dies vermeidet man StructKeyList() die Lage sein, mit allen Arten von Schlüsseln zu behandeln, unabhängig von einem Trennzeichen:

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

und

<cfset nkeys = GetNumericKeys(st)> 

In CF11 Sie ein wenig anspruchsvollen (getestet bekommen auf CF11, kann nicht sagen, wie CF10 diesen Code behandelt).

<cfscript> 
    numericIDs = arrayFilter(structKeyArray(st), function (key) { 
    return IsNumeric(key); 
    }); 
</cfscript> 

Um ganzzahlige Schlüssel zu gewährleisten, verwenden:

<cfscript> 
    numericIDs = arrayFilter(structKeyArray(st), function (key) { 
    return Int(key) eq key; 
    }); 
</cfscript> 
0

Ich sehe nicht wirklich, was mit diesem falsch ist. Es sollte schon recht gut funktionieren, und es ist sehr gut lesbar.

Manchmal ist das Arbeiten mit einer Liste schneller als ein Array.

0

ich dies hatte:

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

Auch mit regulären Ausdrücken zu arbeiten:

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