Arrays 如何在coldfusion中从多维数组中查找和删除元素

Arrays 如何在coldfusion中从多维数组中查找和删除元素,arrays,multidimensional-array,coldfusion,Arrays,Multidimensional Array,Coldfusion,我试图从coldfusion中基于搜索字符串的多维数组中删除一个元素(位置1与搜索字符串匹配时的完整数组)。我提出了下面的方法,它是有效的(这里数组中的第二个元素被删除),但是它出错了,因为它弄乱了索引-当删除后数组的长度为n-1时,它尝试检查第n个元素 <cfset Profiles = [ ["aaa", "xdg", "123", "xyz", "ggg" ], ["bbb", "xwa", "234", "xyz", "f

我试图从coldfusion中基于搜索字符串的多维数组中删除一个元素(位置1与搜索字符串匹配时的完整数组)。我提出了下面的方法,它是有效的(这里数组中的第二个元素被删除),但是它出错了,因为它弄乱了索引-当删除后数组的长度为n-1时,它尝试检查第n个元素

<cfset Profiles  =
[ 
    ["aaa",     "xdg",   "123",   "xyz",  "ggg"   ],
    ["bbb",     "xwa",   "234",   "xyz",  "fff"   ],
    ["ccc",     "xed",   "567",   "xyz",  "eee"   ],
    ["ddd",     "xae",   "789",   "xyz",  "hhh"   ],
    ["eee",     "xsr",   "901",   "xyz",  "bbb"   ],
    ["fff",     "xdg",   "902",   "xyz",  "jjj"   ]
]/>


ArrayFind:#ArrayFind(arrayIndex,CheckFor)#
#arrayDeleteAt(外形、位置)#
更改此选项:

  <cfif #arrayFind( arrayIndex, CheckFor  )# eq 1 > 
        #arrayDeleteAt( Profiles, Position )#
    </cfif>

    <cfset Position++ /> 

#arrayDeleteAt(外形、位置)#
为此:

<cfif #arrayFind( arrayIndex, CheckFor  )# eq 1 > 
        #arrayDeleteAt( Profiles, Position )#
<cfelse>
    <cfset Position++ /> 
</cfif>

#arrayDeleteAt(外形、位置)#

如果您是ACF10+,而不是显式循环,则可以执行以下操作:

<cfscript>

Profiles = [
    ["aaa","bbb","asdf"]
  , ["bbb","asdf","asdfasfs"]
  , ["ccc","dfhgasdfg","bbb"]
  , ["bbb","asdfasdf","Aasdfa"]
] ;

checkfor = "bbb" ;

//// FROM HERE ////    
arrayEach(
  Profiles,
  function(obj){
    obj[1]==checkfor?arrayDelete(Profiles,obj):'';
  }
);
//// TO HERE ////

WriteDump(Profiles);

</cfscript>

您可能可以在删除后使用
cfbreak
退出循环。或者,如果您希望删除多个索引,可以将索引存储在临时数组中,以便在循环后删除。这是一个很好的答案。您应该这样发布。@tech2017我确实需要删除多个,我喜欢这种解决方案。您是否考虑过在构建阵列时使用一盎司的预防措施,而不是在构建阵列后使用一磅的治疗措施?在阵列中反向循环。完全不使用循环是否可以完成此操作?也就是说,检查整个数组中的字符串,并删除出现的行?不要忘记在arrafind()周围去掉多余的。您可以去掉“eq 1”,因为cfif无论如何都会计算arrayfind()的布尔输出。@PatrickSchomburg性能没有变化。只是在那种情况下不需要。更漂亮的代码可以让您或以后必须编辑它的人拥有更美好的未来。:-)ArrayAch和arrayFilter这两个函数返回的内容略有不同。当我将大写元素添加到Profiles数组时,arrayFilter删除了大写的行,而ArrayAch将其保留在输出数组中。在这两者之间,==/EQ(我的arrayEach)似乎表现出某种“区分大小写”的行为,而=/NEQ(我的arrayFilter)表现出某种“不区分大小写”的行为。我来看看两者的区别。我遗漏了一些东西-/
<cfscript>

Profiles = [
    ["aaa","bbb","asdf"]
  , ["bbb","asdf","asdfasfs"]
  , ["ccc","dfhgasdfg","bbb"]
  , ["bbb","asdfasdf","Aasdfa"]
] ;

checkfor = "bbb" ;

//// FROM HERE ////    
arrayEach(
  Profiles,
  function(obj){
    obj[1]==checkfor?arrayDelete(Profiles,obj):'';
  }
);
//// TO HERE ////

WriteDump(Profiles);

</cfscript>
p2 = arrayFilter( Profiles, function(obj){ return obj[1] != checkfor ; } );