在lodash中合并两个对象

时间:2015-03-30 17:10:02

标签: javascript angularjs angularjs-scope lodash

我有两个对象数组如下:

$scope.var1 = [{
    "field_name": "fname",
    "mapped_field": "firstName",
    "position": 2
}, {
    "field_name": "lname",
    "mapped_field": "lastName",
    "position": 1
}, {
    "field_name": "email",
    "mapped_field": "Email",
    "position": 1
}];

$scope.final = [{
    "field_name": "fname",
    "mapped_field": "lastName",
    "position": 2
}, {
    "field_name": "lname",
    "mapped_field": "firstName",
    "position": 1
}];

在这里,我想替换最后一个 mapped_field 与var1' s mapped_field 匹配,var1的剩余部分也合并到最后一个。

决赛应该是这样的:

$scope.final = [{
    "field_name": "fname",
        "mapped_field": "firstName",
        "position": 2
}, {
    "field_name": "lname",
    "mapped_field": "lastName",
    "position": 1
}, {
    "field_name": "email",
    "mapped_field": "Email",
    "position": 1
}];

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

结合使用lodash函数:_.forEach_.assign

_.forEach($scope.var1, function(varObject) {
    //find object with the same mapped_field
    var finalArrayItem = _.find($scope.final, {mapped_field: varObject.mapped_field});
    if (finalArrayItem) {
        //merge objects
        _.assign(finalArrayItem, varObject);
    } else {
        $scope.final.push(varObject);
    }
});

链接到jsbin

答案 1 :(得分:1)

以下是我提出的建议:

final = _.map(var1, function(item) {
    return _.assign(
        _.find(final, _.pick(item, 'mapped_field')) || {},
        item
    );
});

您使用map()创建新final数组的位置。要映射的数组是var1,我们为每个数组项返回一个新对象。 assign()函数用于覆盖final中包含var1属性的属性。

要使用final项目映射当前var1项目,请使用find()pick()函数可以方便地构造过滤器对象。在这里,您说要匹配mapped_field属性。

对于没有匹配项的情况,逻辑||是必需的。例如,email对象。这只会将所有var1属性复制到空对象中,然后返回。