在lodash独特的联盟

时间:2013-03-11 19:40:01

标签: javascript arrays lodash

我有两种收藏品:

fieldMappingViewModel.MappedFields():

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

_all:

[
    { "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:从我的最终结果中取消? (我只想过滤那些非空对存在的空值。否则我想保留该对中的空值)

所以我最终没有结束

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

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

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

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

1 个答案:

答案 0 :(得分: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来清除空值,这次考虑了我们拥有的这个EmailField的实例数 - 如果只有一个我们保留它。最后,我们使用flatten再次拥有一个对象数组。