【问题标题】:merge two objects in lodash合并lodash中的两个对象
【发布时间】:2015-06-03 19:40:24
【问题描述】:

我有两个对象数组如下:

$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
}];

这里我想替换 ma​​pped_field 与 var1 的 ma​​pped_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
}];

我们将不胜感激。

【问题讨论】:

  • 你试过_.assign(destObj, srcObj)吗?

标签: javascript angularjs angularjs-scope lodash


【解决方案1】:

使用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

【讨论】:

  • 它不会替换最后一个中现有的 mapped_field。它应该查找是否已经存在与 var1 映射的 mapped_field,然后将其删除并添加新的。
  • @KrishnaBhatt,我认为 mapped_field 是显示对象应如何链接的唯一字段。否则 - 我应该如何在 $scope.final 中找到来自 $scope.var1 的对象?
  • 是的,你是对的。我现在修好了。感谢我的代码终于可以工作了。
【解决方案2】:

这是我想出的:

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

您在哪里使用 map() 创建新的 final 数组。被映射的数组是var1,我们为每个数组项返回一个新对象。 assign() 函数用于使用来自var1 的属性覆盖final 中的属性。

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

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

【讨论】:

  • 谢谢。这是最好的和简短的解决方案。我正在读你的书,但仍处于学习阶段。
  • 它似乎覆盖了最终对象的值。决赛中已经有值,我也想保留它们。
  • @KrishnaBhatt,您可以更改传递给assign() 的值的顺序。第一个参数将始终获取累积的更改,包括属性覆盖。您可以将代码更改为assign(item, _.find(final...,以便最终对象始终优先。或者您可以将assign() 替换为defaults(),这只会添加新属性而不是覆盖现有属性。
  • 如何检查最终对象中 mapped_field 是否存在重复键?
  • 为什么需要检查?让assign()defaults()为你合并吧。
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多