【问题标题】:unique union in lodashlodash中的独特联合
【发布时间】:2013-03-11 19:40:01
【问题描述】:

我有两种收藏:

fieldMappingViewModel.MappedFields():

[
{ "EmailField" : "FirstName", "CrmField" : "FirstName" },
{ "EmailField" : "LastName", "CrmField" : "LastName" },
{ "EmailField" : "Job", "CrmField" : "JobTitle" }...
]

_全部:

[
    { "EmailField" : "FirstName", "CrmField" : null },
    { "EmailField" : "LastName", "CrmField" : "LastName" },
    { "EmailField" : "Job", "CrmField" : "JobTitle" }...
    ]

我正在尝试使用以下方法创建这两者的唯一联合:

fieldMappingViewModel.allMappings(_.uniq(_.union(fieldMappingViewModel.MappedFields(), _all),
                function (item, key) {
                    // not the ones that their item.EmailField() already exists with a CrmField value
                }));

当然,严格相等仍然存在于具有重复电子邮件字段但其 CrmField 不同的结果对象中。

如何从我的最终结果中删除带有 CrmField: Null 的那些? (我只想过滤那些存在非空对的空值。否则我想保留其中包含空值的对)

所以我没有结束

{ "EmailField" : "FirstName", "CrmField" : "FirstName" }

{ "EmailField" : "FirstName", "CrmField" : null }

两者都在最终结果中。但只有:

{ "EmailField" : "FirstName", "CrmField" : "FirstName" }

【问题讨论】:

    标签: javascript arrays lodash


    【解决方案1】:

    我的理由是,您需要一个函数来生成:

    { "EmailField" : "FirstName", "CrmField" : "FirstName" }
    

    { "EmailField" : "FirstName", "CrmField" : null }
    

    相同的值,因此 uniq 操作只会选择其中一个,但取决于哪个先出现,您最终可以选择其中任何一个。就 uniq 而言,唯一的另一种方法是将它们区分开来,在这种情况下,你最终会得到你不想要的两者。

    我建议您使用过滤操作,将删除 uniq 之后的空值。

    一个可能的解决方案是:

    var arr1 = 
        [
        { "EmailField" : "FirstName", "CrmField" : null },
        { "EmailField" : "LastName", "CrmField" : "LastName" },
        { "EmailField" : "Job", "CrmField" : "JobTitle" }
        ];
    
    var arr2 = 
        [
        { "EmailField" : "FirstName", "CrmField" : "FirstName" },
        { "EmailField" : "LastName", "CrmField" : "LastName" },
        { "EmailField" : "Job", "CrmField" : "JobTitle" },
        ];
    
    var res = _.flatten(_.map(_.groupBy(_.union(arr1, arr2), function (item) {
        return item.EmailField;
    }), function (set) {
            if (set.length > 1) {
                return _.filter(_.uniq(set, function (item) {
                    return item.EmailField + ' ' + item.CrmField;
                }), function (item) {
                    return item.CrmField != null;
                });
            }
            return set;        
    }));
    
    console.log(res);
    

    uniq 操作被 groupBy 替换,然后我们使用 map 和 filter 来清除 null 值,同时考虑到我们有多少这个 EmailField 的实例——如果只有一个我们保留它。最后,我们使用 flatten 再次拥有一个对象数组。

    【讨论】:

    • 我只想过滤那些存在非空对的空。否则我想在其中保留 null 对
    • 我已经编辑了我的回复,如果您还没有找到解决方案,也许您会觉得这很有帮助。
    • 感谢 svetoslavnedkov。最终更改了服务器响应,因为对此客户端上的大量计算感到不舒服。
    猜你喜欢
    • 2022-11-08
    • 2015-06-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多