6

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

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

我一直在尝试这个:

<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 就不等于 yes。实现我想要做的事情的最佳方式是什么?

4

4 回答 4

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>
于 2012-02-12T21:23:48.373 回答
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>

当然,这假定这些中的每一个都应默认设置为“否”。

于 2012-02-12T21:27:00.120 回答
2

在 ColdFusion 8 及更高版本中,a<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

于 2014-05-07T20:54:21.650 回答
1

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

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

于 2012-07-06T04:28:30.193 回答