我有两种收藏品:
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" }
答案 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再次拥有一个对象数组。