如何从Coldfusion中的结构数组中删除重复项

时间:2016-10-05 19:35:28

标签: coldfusion coldfusion-11

我想减少这一点,请注意我在这里有一个我知道标记为唯一标识符的字段:

http://image.prntscr.com/image/f53c3254353c47b099f7d40256845110.png

对此:

enter image description here

2 个答案:

答案 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>