使用ColdFusion循环遍历数组

时间:2012-02-12 21:07:47

标签: arrays coldfusion cfloop

我有一个购物车阵列,它有一个变量告诉我该产品是否是附件,这将是是或否。我需要遍历购物车并找出以下内容:

  • 如果购物车仅包含配件;做任何事。
  • 如果购物车只是产品;做任何事。
  • 如果购物车有产品和配件;做任何事。

我一直在尝试这个:

<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
  <cfif session.mycart[i].accs EQ "yes">
    <cfset accPresent = "yes">
  </cfif>
  <cfif session.mycart[i].accs EQ "no">
    <cfset prodpresent = "yes">
  </cfif>
</cfloop>

<cfif accPresent EQ "yes" and prodPresent EQ "no">
  <cfset  bothPresent EQ "yes">
</cfif>

由于没有找到accPresent,这就失败了,我认为这是因为循环一次经过一个,并且一旦找到非附属产品,accs就不等于是。实现我想要做的最好的方法是什么?

4 个答案:

答案 0 :(得分:6)

这样做

<cfset accPresent = "no" />
<cfset prodPresent = "no" />
<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
    <cfif session.mycart[i].accs EQ "yes">
        <cfset accPresent = "yes">
    </cfif>
    <cfif session.mycart[i].accs EQ "no">
        <cfset prodpresent = "yes">
    </cfif>
</cfloop>

<cfif accPresent EQ "yes" and prodPresent EQ "no">
    <cfset  bothPresent EQ "yes">
</cfif>

答案 1 :(得分:3)

杰森,

您的第3个陈述假定AccPresent和ProdPresent都存在。你先创建它们并给它们默认值吗?试试这个:

<cfparam name="accPresent" default="no"/>
<cfparam name="prodPresent" default="no"/>
<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
<cfif session.mycart[i].accs EQ "yes">
<cfset accPresent = "yes">
</cfif>
<cfif session.mycart[i].accs EQ "no">
<cfset prodpresent = "yes">
</cfif>
</cfloop>    
<cfif accPresent EQ "yes" and prodPresent EQ "no">
<cfset  bothPresent EQ "yes">
</cfif>

这当然假设默认情况下每个都应该设置为“no”。

答案 2 :(得分:2)

在ColdFusion 8及更高版本中,<cfloop>可以直接使用数组

<cfloop index="i" array="#session.mycart#">
  <cfif i.accs EQ "yes">
    <cfset accPresent = "yes">
  </cfif>
  <cfif i.accs EQ "no">
    <cfset prodpresent = "yes">
  </cfif>
</cfloop>

<cfif accPresent EQ "yes" and prodPresent EQ "no">
  <cfset  bothPresent EQ "yes">
</cfif>

注意:i指的是包含数据的结构,而不是数据的位置

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_j-l_15.html

答案 3 :(得分:1)

在CF 10(或Railo 4)中,使用cfscript和Underscore.cfc library可以更优雅地完成此操作:

_ = new Underscore();

myCart = duplicate(session.myCart);

accPresent = _.any(myCart, function(val) {
    return val.accs;
});

prodPresent = _.any(myCart, function(val) {
    return !val.accs;
});

bothPresent = accPresent && prodPresent;

关于_.find()的好处是它会在迭代器函数返回true时立即停止,因此您不必迭代数组中的每个元素。

注意:在访问共享范围变量时,建议使用duplcate()以防止死锁。

(免责声明:我写过Underscore.cfc)

相关问题