3

私は2種類のコレクションを持っています:

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" }...
    ]

以下を使用して、これら2つの一意の結合を作成しようとしています:

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

もちろん、Email フィールドが繰り返されているが CrmField が異なる結果オブジェクトには厳密な等価性が残っています。

最終結果から CrmField: Null を削除するにはどうすればよいですか? (null以外のペアが存在するnullのもののみをフィルタリングしたい。それ以外の場合は、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 操作はそれらの 1 つだけを選択しますが、どちらが最初に来るかに応じて、それらのいずれかになる可能性があります。uniq に関しては、他の唯一の方法はそれらを区別することであり、この場合、望ましくない両方になってしまいます。

uniq の後の null 値を削除するフィルター操作を使用することをお勧めします。

関数が多用されているため、おそらく最善の解決策ではありませんが、考えられる解決策は次のとおりです。

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 のインスタンスの数を考慮して null 値を除外します (1 つしかない場合は保持します)。最後に flatten を使用して、オブジェクトの単一の配列を再び取得します。

于 2013-03-11T20:23:43.387 に答える