coldfusion 基于阵列模数创建四个结构的简便方法

coldfusion less cumbersome way to create four structures based on array modulus

我有一个数组"varray"需要拆分成四个结构。每四个元素中的第一个应该在结构 1 中,第二个在结构 2 中,依此类推。我有一些工作代码可以做到这一点,但我觉得应该有一种不那么麻烦的方法。这是代码:

<cfset xord  = StructNew()>
<cfset xsort = StructNew()>
<cfset xsel  = StructNew()>
<cfset xmer  = StructNew()>

<cfloop from = '1' to = "#ArrayLen(varray)#" index = 'i'>
  <cfset fieldname = farray[i]> <!---farray previously defined --->
  <cfset val = varray[i]> <!---varray previously defined --->
 <cfset j = i%4>

 <cfif j EQ 1>
   <cfset xord[fieldname] = val>
 <cfselseif j EQ 2>
   <cfset xsort[fieldname]= val>
 <cfelseif j EQ 3>
   <cfset xsel[fieldname] = val>
 <cfelseif j EQ 0>
   <cfset xmer[fieldname] = val>
 </cfif>

</cfloop>  

任何人都可以建议更好的方法吗?

另外两种方法。 我不一定会说这些更好,只是不同而已:

需要字段数组长度匹配值数组长度

<cfset farray = ['field1','field2','field3','field4','field5']>
<cfset varray = ['apple','orange','pear','kiwi','pineapple']>

<cfset xord  = {}>
<cfset xsort = {}>
<cfset xsel  = {}>
<cfset xmer  = {}>

<cfloop from="1" to="#ArrayLen(varray)#" index="i">
 <cfset j = 
    ((i%4 EQ 1) ? (StructInsert(xord,farray[i],varray[i])):
    ((i%4 EQ 2) ? (StructInsert(xsort,farray[i],varray[i])):
    ((i%4 EQ 3) ? (StructInsert(xsel,farray[i],varray[i])):
    ((i%4 EQ 0) ? (StructInsert(xmer,farray[i],varray[i])): 0))))>
</cfloop>  

<cfdump var="#xord#" />
<cfdump var="#xsort#" />
<cfdump var="#xsel#" />
<cfdump var="#xmer#" />

或:

<cfloop from="1" to="#ArrayLen(varray)#" index="i">
  <cfswitch expression="#i%4#">
    <cfcase value="0">
      <cfset xmer[farray[i]] = varray[i]>
    </cfcase>
    <cfcase value="1">
      <cfset xord[farray[i]] = varray[i]>
    </cfcase>
    <cfcase value="2">
      <cfset xsort[farray[i]] = varray[i]>
    </cfcase>
    <cfcase value="3">
      <cfset xsel[farray[i]] = varray[i]>
    </cfcase>
  </cfswitch>
</cfloop>  

<cfdump var="#xord#" />
<cfdump var="#xsort#" />
<cfdump var="#xsel#" />
<cfdump var="#xmer#" />

字段数组长度不必匹配值数组长度

<cfset farray = ['field1','field2','field3','field4']>
<cfset varray = ['apple','orange','pear','kiwi','pineapple']>

<cfset xord  = {}>
<cfset xsort = {}>
<cfset xsel  = {}>
<cfset xmer  = {}>

<cfloop from="1" to="#ArrayLen(varray)#" index="i">
 <cfset j = 
    ((i%4 EQ 1 AND ArrayIsDefined(farray,i)) ? (StructInsert(xord,farray[i],varray[i],true)) :
    ((i%4 EQ 2 AND ArrayIsDefined(farray,i)) ? (StructInsert(xsort,farray[i],varray[i],true)) :
    ((i%4 EQ 3 AND ArrayIsDefined(farray,i)) ? (StructInsert(xsel,farray[i],varray[i],true)) :
    ((i%4 EQ 0 AND ArrayIsDefined(farray,i)) ? (StructInsert(xmer,farray[i],varray[i],true)) : 0))))>
</cfloop>  

<cfdump var="#xord#" />
<cfdump var="#xsort#" />
<cfdump var="#xsel#" />
<cfdump var="#xmer#" />

或:

<cfloop from="1" to="#ArrayLen(varray)#" index="i">
  <cfswitch expression="#i%4#">
    <cfcase value="0">
      <cfset (ArrayIsDefined(farray,i) ? (StructInsert(xmer,farray[i],varray[i],true)) : 0)>
    </cfcase>
    <cfcase value="1">
      <cfset (ArrayIsDefined(farray,i) ? (StructInsert(xord,farray[i],varray[i],true)) : 0)>
    </cfcase>
    <cfcase value="2">
      <cfset (ArrayIsDefined(farray,i) ? (StructInsert(xsort,farray[i],varray[i],true)) : 0)>
    </cfcase>
    <cfcase value="3">
      <cfset (ArrayIsDefined(farray,i) ? (StructInsert(xsel,farray[i],varray[i],true)) : 0)>
    </cfcase>
  </cfswitch>
</cfloop>  

<cfdump var="#xord#" />
<cfdump var="#xsort#" />
<cfdump var="#xsel#" />
<cfdump var="#xmer#" />

cfscript怎么样?

<cfscript>
function groupByOp(values, fieldnames) {
    var ops = ['mer', 'ord', 'sort', 'sel'];
    var byOp = {};
    arrayEach(values, function (val, i) {
        byOp["x#ops[i % 4 + 1]#"][fieldnames[i]] = val;
    });
    return byOp;
}
</cfscript>

这利用了当您提到不存在的成员时 CF 会自动创建结构的事实。

测试:

<cfset v = ListToArray('1,2,3,4,5,6')>
<cfset f = ListToArray('a,b,c,d,e,f')>
<cfoutput>
    <pre>#SerializeJSON(groupByOp(v, f))#</pre>
</cfoutput>

产出

{
    "xsel": {
        "c": "3"
    },
    "xord": {
        "e": "5",
        "a": "1"
    },
    "xsort": {
        "b": "2",
        "f": "6"
    },
    "xmer": {
        "d": "4"
    }
}

(您没有提到您的版本,所以我不知道您是否可以访问更新的函数,例如 array each()。请记住,在更新的版本中有更灵活的选项)

不要创建单独的变量,而是创建一个包含 4 个变量和一个名称数组的结构。然后使用数组和 MOD 填充子结构。 请注意,下面的示例预先创建子结构以确保它们始终存在 - 即使 field/value 数组为空或包含的元素少于 4 个。

TryCF.com Example

<cfset farray = ["A","B","C","D","E","F","G","Q","T"]>
<cfset varray = ["11","22","33","RR","55","NN","77","68","46"]>
<cfset data   = {xOrd={},xSort={},xSel={},xMer={}}>
<cfset names  = ["xOrd","xSort","xSel","xMer"]>

<cfloop from="1" to="#ArrayLen(varray)#" index="i">
  <cfset fieldName = farray[i]>
  <cfset fieldValue = varray[i]> 
  <cfset structName = names[i%4+1]>
  <cfset data[structName][fieldName] = fieldValue>
</cfloop>  

可以通过父结构访问子结构,data

<cfdump var="#data.xOrd#" label="data.xOrd">
<cfdump var="#data.xSort#" label="data.xSort">
<cfdump var="#data.xSel#" label="data.xSel">
<cfdump var="#data.xMer#" label="data.xMer"> 

我做了一些 CF 已经很久了,但是使用 local 范围的基于标签的方法:

<cfset keys = ['xord', 'xsort', 'xsel', 'xmer'] />
<cfset farray = ['f1','f2','f3','f4','f5','f6','f7','f8']>
<cfset varray = ['v1','v2','v3','v4','v5','v6','v7','v8']>

<cfloop from="1" to="#ArrayLen(varray)#" index="i">
    <cfset local[keys[i%4+1]][farray[i]] = varray[i]>
</cfloop>

<cfdump var="#xord#" />
<cfdump var="#xsort#" />
<cfdump var="#xsel#" />
<cfdump var="#xmer#" />

现在 xordxsortxselxmerlocal 范围内填充了正确的键值对。