我想减少这一点,请注意我在这里有一个我知道标记为唯一标识符的字段:
http://image.prntscr.com/image/f53c3254353c47b099f7d40256845110.png
对此:
答案 0 :(得分:4)
我是通过编写这个函数来完成的(基本上将键复制到结构中,如果它不存在并将其添加到最终数组中):
<cffunction name="RemoveDuplicatesFromObjectArray">
<cfargument name="objs" type="array">
<cfargument name="key" type="string">
<cfscript>
var keys ={};
var result = [];
for (var obj in arguments.objs)
{
if (not StructKeyExists(keys, obj[arguments.key]))
{
ArrayAppend(result, obj);
keys[obj[arguments.key]] = true;
}
}
</cfscript>
<cfreturn result>
</cffunction>
并将其称为:
<cfset arr = [{
"EXPENSEREPORTID": 129591,
"EXPENSELINEITEMID": 602684,
"DOLLARSBEFORE": 8.1000000000,
"DOLLARSAFTER": 5.4000000000
}, {
"EXPENSEREPORTID": 129591,
"EXPENSELINEITEMID": 602684,
"DOLLARSBEFORE": 8.1000000000,
"DOLLARSAFTER": 5.4000000000
}]>
<Cfdump var="#RemoveDuplicatesFromObjectArray(arr,'EXPENSEREPORTID')#">
答案 1 :(得分:3)
只是为了好玩,因为你在CF11 +,我想我会用ArrayFilter()来做,因为你可能有兴趣看到另一种选择,但你的回答很好(我看到Leigh解决了几个问题)。您构建了一个结构来匹配键并同时修改返回数组。
使用结构作为索引将远远超过可能在大型数组上使用ArrayFind()的其他方法。什么更好是从一开始就在数组上构建一个结构。通过这种方式,您不必担心唯一性。如果订单很重要,可以使用LinkedHashMaps。
以下是示例: http://trycf.com/gist/df2fad58219163b7b64c9523b8383921/acf11
<cfscript>
data = [
{
dollarsafter : 5.4
, dollarsbefore : 8.1
, expenselineitemid : 602684
, expensereportid : 129591
}
,{
dollarsafter : 5.4
, dollarsbefore : 8.1
, expenselineitemid : 602684
, expensereportid : 129593
}
,{
dollarsafter : 5.4
, dollarsbefore : 8.1
, expenselineitemid : 602684
, expensereportid : 129591
}
];
function doFilter( data ){
var index = {};
return data.filter( function( item ){
return ! itemFoundInIndexByKey( item, index, item['expensereportid'] );
});
}
function itemFoundInIndexByKey( item, index, key ){
var foundIt = index.keyExists( key );
if( ! foundIt ){
index[ key ] = '';
}
return foundIt;
}
writeDump( doFilter( data ) );
</cfscript>
Bonus示例简明代码(不使用过滤器的可重用逻辑): http://trycf.com/gist/e3ae76877bdc0809f02ee3333d51f8ae/acf11?theme=monokai
<cfscript>
data = [
{
dollarsafter : 5.4
, dollarsbefore : 8.1
, expenselineitemid : 602684
, expensereportid : 129591
}
,{
dollarsafter : 5.4
, dollarsbefore : 8.1
, expenselineitemid : 602684
, expensereportid : 129593
}
,{
dollarsafter : 5.4
, dollarsbefore : 8.1
, expenselineitemid : 602684
, expensereportid : 129591
}
];
function filterDuplicateObjectArrayByKey( required array data, required string key, index = {} ){
return data.filter( function( item ){
if( ! index.keyExists( item[ key ] ) ){
index[ item[ key ] ] = '';
return true;
}
return false;
});
}
writeDump( filterDuplicateObjectArrayByKey( data, 'expensereportid' ) );
</cfscript>