2015-11-26 10 views
6

Ho una struct ColdFusion contenente chiavi mix numerica e alfa, caratteri alfanumericiColdfusion Struct ottenere solo numerico lista chiave

ho bisogno di accedere solo i tasti numerici.

mio codice è simile

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

Esiste un metodo migliore per risolvere questi problemi?

+1

userei una matrice piuttosto che una lista, ma a parte questo, questo approccio sembra che vada bene. Ci sono opzioni migliori con versioni più recenti di CF, ma se sei bloccato su CF9, così sia. –

risposta

6

Esiste un metodo migliore per risolvere questi problemi?

Vorrei usare qualcosa di simile:

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

Questo è veramente utile. – Pankaj

4

Esiste un metodo migliore per risolvere tali problemi?

In genere consiglio di utilizzare array anziché elenchi.

In CF9 un loop simile al tuo è buono come si arriva. Puoi farne una funzione di utilità se ne hai bisogno più di una volta. Questo evita StructKeyList() per essere in grado di affrontare tutti i tipi di chiavi, indipendenti di un carattere separatore:

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

e

<cfset nkeys = GetNumericKeys(st)> 

In CF11 è possibile ottenere un po 'più sofisticato (testati su CF11, non posso dire come CF10 gestisce questo codice).

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

Per garantire chiavi intere, utilizzare:

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

davvero non vedere cosa c'è di sbagliato in questo. Dovrebbe funzionare abbastanza bene, ed è molto leggibile.

A volte lavorare con una lista è più veloce di una matrice.

0

ho avuto questo:

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

possibile lavorare anche con l'espressione regolare:

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