2015-11-26 12 views
6

Tôi có Coldfusion Struct chứa các phím trộn số và alpha, chữ và sốColdfusion Struct chỉ nhận được danh sách khóa số

Tôi chỉ cần truy cập các phím số.

Mã của tôi trông giống như

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

Có một phương pháp tốt hơn để giải quyết vấn đề như vậy?

+1

Tôi muốn sử dụng một mảng chứ không phải là một danh sách, nhưng khác hơn thế, cách tiếp cận này có vẻ tốt đẹp. Có những lựa chọn tốt hơn với các phiên bản mới hơn của CF, nhưng nếu yer bị mắc kẹt trên CF9, do đó, được nó. –

Trả lời

6

Có một phương pháp tốt hơn để giải quyết vấn đề như vậy?

Tôi sẽ sử dụng một cái gì đó như thế này:

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

Điều này thực sự tiện dụng. – Pankaj

4

Có phương pháp nào tốt hơn để giải quyết các vấn đề đó không?

Tôi thường khuyên bạn nên làm việc với các mảng thay vì danh sách.

Trong CF9, vòng lặp tương tự như vòng lặp của bạn cũng tốt như vậy. Bạn có thể làm cho một chức năng tiện ích ra khỏi nó nếu bạn cần nó nhiều hơn một lần. Cái này tránh StructKeyList() để có thể đối phó với tất cả các loại chìa khóa, không phụ thuộc vào một ký tự phân cách:

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

Trong CF11 bạn có thể trở nên phức tạp hơn một chút (thử nghiệm trên CF11, không thể nói cách CF10 xử lý mã này).

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

Để đảm bảo các phím số nguyên, sử dụng:

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

tôi thực sự không thấy có gì sai với điều này. Nó sẽ hoạt động khá tốt, và nó rất dễ đọc.

Đôi khi làm việc với Danh sách nhanh hơn Mảng.

0

Tôi có điều này:

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

Cũng có thể làm việc với biểu thức chính quy:

inList2 = REReplace(inList,"[^0-9.]", "","ALL"); 
Các vấn đề liên quan