3

我有两种收藏:

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" }
4

1 回答 1

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 再次拥有一个对象数组。

于 2013-03-11T20:23:43.387 回答