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