我有两个对象数组如下:
$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
}];
任何帮助都将受到高度赞赏。
答案 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
属性复制到空对象中,然后返回。