2016-07-01 9 views
2

Ich bekomme den Fehler Variable ARRAYCONTAINS ist undefined. Ich bin mir nicht sicher, was das Problem mit meiner Syntax ist.ArrayContains undefined Coldfusion

mein Code hier:

<cfoutput> 
    <cfinvoke method="estimatedShipping" state="CA" returnvariable="days"/> 
    CA: #days# 
    <br> 
</cfoutput> 

<cffunction name="estimatedShipping" output="false" returntype="any"> 
    <cfargument name="state" type="string" required="yes"/> 

    <cfset oneDayStates = ["CA"] > 
    <cfset twoDayStates = ["WA","OR","NV","ID","AZ", "UT"] > 
    <cfset threeDayStates = ["MT","WY","CO","NM"] > 
    <cfset fourDayStates = ["ND","SD","NE","KS","OK","TX","MN","IA","MO","AR","LA", "WI","MI","IL","IN","KY","TN","MS","AK","AL","GA","OH","WV"] > 
    <cfset fiveDayStates = ["ME","VT","NY","NH","MA","RI","CT","NJ","PA","MD","DE","VA","NC","SC","FL", "HI"] > 

    <cfif #arrayContains(oneDayStates, state)# eq 'YES'> 
     <cfset count = "1"> 
    <cfelseif #arrayContains(twoDayStates, state)# eq 'YES'> 
     <cfset count = "2"> 
    <cfelseif #arrayContains(threeDayStates, state)# eq 'YES'> 
     <cfset count = "3"> 
    <cfelseif #arrayContains(fourDayStates, state)# eq 'YES'> 
     <cfset count = "4"> 
    <cfelseif #arrayContains(fiveDayStates, state)# eq 'YES'> 
     <cfset count = "5"> 
    <cfelse> 
     <cfset count = "5+"> 
    </cfif> 
    <cfreturn count /> 
</cffunction> 
+3

Welche Version von ColdFusion verwenden Sie? 'arrayContains' wurde in ColdFusion 9 eingeführt. Außerdem ist es nicht notwendig, einen Funktionsaufruf in bedingten Anweisungen mit' # 'zu umbrechen. – Alex

Antwort

2

Da es sich um ein in sich geschlossenes Beispiel ist, führen Sie es auf http://trycf.com. It works with CF10 and Lucee. Also ist technisch nichts falsch daran. Sie verwenden wahrscheinlich eine ältere Version, die that function nicht unterstützt. Prüfen Sie die CF-Version:

<cfdump var="#server.coldfusion.productversion#"> 

Eine Alternative zu dieser Funktion, werfen Sie einen Blick auf http://cflib.org. Sie können etwas haben, das Sie als Ersatz verwenden können, oder zumindest die Basis für einen wie ArrayContains UDF. Das heißt, normalerweise würden Sie diese Art von Informationen in einer Datenbank speichern. Angenommen, dies ist keine Option, könnte es einfacher sein, eine Struktur zu verwenden. Verwenden Sie die Anzahl der Versandtage als "Schlüssel" und eine Liste von Zuständen als "Wert".

<cfset shipping = {} > 
<cfset shipping[1] = "CA" > 
<cfset shipping[2] = "WA,OR,NV,ID,AZ,UT" > 
<cfset shipping[3] = "MT,WY,CO,NM" > 
<cfset shipping[4] = "ND,SD,NE,KS,OK,TX,MN,IA,MO,AR,LA,WI,MI,IL,IN,KY,TN,MS,AK,AL,GA,OH,WV" > 
<cfset shipping[5] = "ME,VT,NY,NH,MA,RI,CT,NJ,PA,MD,DE,VA,NC,SC,FL,HI" > 

<cfset result = "5+"> 
<cfloop collection="#shipping#" item="days"> 
    <cfif listFindNoCase(shipping[ days ], stateCodeToFind)> 
     <cfset result = days > 
     <cfbreak> 
    </cfif> 
</cfloop> 

nichts mit der Frage zu tun, aber

  1. immer var oder local Umfang alle Funktion lokale Variablen
  2. Keine Notwendigkeit für die überschüssige Pfund-Zeichen in der CFIF
  3. Da ArrayContains einen booleschen Wert zurückgibt, ist es einfach r zu schreiben:

    <cfif arrayContains(oneDayStates, state)> 
    

    Statt

    <cfif arrayContains(oneDayStates, state) eq 'YES'> 
    
+1

Ändern Sie '' in '' und das Beispiel wäre korrekt. ;) – Alex

+0

@Alex - Ja, du hast Recht. Total übersehen die cfelse ;-) – Leigh

1

Hier ist eine Lösung für Coldfusion 8 und unten:

<cffunction name="estimatedShipping" output="false" returntype="any"> 
    <cfargument name="state" type="string" required="yes"> 

    <cfset var LOCAL = structNew()> 

    <cfset LOCAL.oneDayStates = ["CA"]> 
    <cfset LOCAL.twoDayStates = ["WA", "OR", "NV", "ID", "AZ", "UT"]> 
    <cfset LOCAL.threeDayStates = ["MT", "WY", "CO", "NM"]> 
    <cfset LOCAL.fourDayStates = ["ND", "SD", "NE", "KS", "OK", "TX", "MN", "IA", "MO", "AR", "LA", "WI", "MI", "IL", "IN", "KY", "TN", "MS", "AK", "AL", "GA", "OH", "WV"]> 
    <cfset LOCAL.fiveDayStates = ["ME", "VT", "NY", "NH", "MA", "RI", "CT", "NJ", "PA", "MD", "DE", "VA", "NC", "SC", "FL", "HI"]> 

    <cfset ARGUMENTS.state = uCase(ARGUMENTS.state)> 

    <cfif LOCAL.oneDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "1"> 
    <cfelseif LOCAL.twoDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "2"> 
    <cfelseif LOCAL.threeDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "3"> 
    <cfelseif LOCAL.fourDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "4"> 
    <cfelseif LOCAL.fiveDayStates.indexOf(ARGUMENTS.state) gte 0> 
     <cfset LOCAL.count = "5"> 
    <cfelse> 
     <cfset LOCAL.count = "5+"> 
    </cfif> 

    <cfreturn LOCAL.count> 
</cffunction> 

Ich reparierte auch die Widersprüchlichkeit und scoped richtig Ihrem lokalen Variablen.

+2

Alex - Nichts gegen die Antwort, aber ich würde nicht empfehlen, indexOf in diesem speziellen Fall. Hier ist warum: [indexOf] (http://docs.oracle.com/javase/7/docs/api/java/util/List.html#indexOf (java.lang.Object)) ist ein * lot * weniger tolerant als die meisten nach der Verwendung von CF-Funktionen erwarten. Im Gegensatz zu CF reagiert javas indexOf sowohl auf den Variablentyp case * als auch auf *. Eine Suche nach "15" ergibt andere Ergebnisse als eine Suche nach "val (15)". Angesichts der Möglichkeit für unerwartetes Verhalten, besser mit reinem CF IMO zu bleiben. Zumindest etwas, das eher zu den Ergebnissen führt, die man erwarten würde. Nur meine 2 ¢ – Leigh

+0

Richtig, aber ich denke, dass es in diesem Fall sicher ist. Er übergibt einen String und hat Strings in seinen Arrays. Aber du hast recht, wenn du dich über 'indexOf',' contains' usw. im Klaren bist. – Alex

+0

(Bearbeiten) Nun, da andere Optionen existieren, stimme ich immer noch nicht zu, aber wenn du es benutzen willst, zumindest in Großbuchstaben 'arguments.state ', oder es findet keine Übereinstimmung, wenn der angegebene Wert in einem anderen Fall ist ;-) – Leigh