我想知道是否有一种简单的方法可以在冷融合列表或数组中强制执行不同的值。
谢谢
<cfset temp = structNew()>
<cfloop list="a,b,c,a,c" index="i">
<cfset temp[i] = "">
</cfloop>
<cfset distinctList = structKeyList(temp)>
这是我能想到的最简单的解决方案。这样做的缺点是不保留顺序,并且列表项不区分大小写。如果您需要不区分大小写,请使用 Java 的 hashset。
在添加值之前,使用 arrayContains 或 listFindNoCase 检查它是否存在。
没有预定义的函数可以满足您的要求,但是很容易实现您自己的函数来执行此操作。我提供的功能非常简单,易于扩展。
variables.myList = "one,two,three";
variables.myList = ListAppendDistinct(variables.myList, "three");
variables.myList = ListAppendDistinct(variables.myList, "four");
function ListAppendDistinct(list, value)
{
var _local = StructNew();
_local.list = list;
if (NOT ListContains(_local.list, value))
{
_local.list = ListAppend(_local.list,value);
}
return _local.list;
}
您可以使用上面的函数来明确地附加到数组中,这一切都假设您使用的是默认分隔符。我不确定您的数据的“大小”,因为它可能会变得昂贵。
variables.myArray = ArrayNew(1);
variables.myArray[1] = "one";
variables.myArray[2] = "two";
variables.myArray[3] = "three";
variables.myArray = ArrayAppendDistinct(variables.myArray, "three");
variables.myArray = ArrayAppendDistinct(variables.myArray, "four");
function ArrayAppendDistinct(array, value)
{
var _local = StructNew();
_local.list = ArrayToList(array);
_local.list = ListAppendDistinct(_local.list,value);
return ListToArray(_local.list);
}
您可以在 CF 10 或 Railo 4 中使用Underscore.cfc 库:
_ = new Underscore();// instantiate the library
uniqueArray = _.uniq(array);// convert an array to a unique array
我认为没有比这更简单的了!
(免责声明:我写了 Underscore.cfc)
对于那些现在正在查看这个答案的人:是的。有一个函数叫做ListRemoveDuplicates()
. 它是在 ColdFusion 10 (2017) 中添加的。
例如,下面的代码返回唯一值“AA,BB,CC”
newList = listRemoveDuplicates("AA,BB,CC,AA,AA,AA,BB", ",");
writeOutput("newList = #newList#");