我有2个对象数组:
var a = [
{ "image_id": 631293, "score": 73 },
{ "image_id": 11848407, "score": 56 }
];
var b = [
{ "image_id": 631293, "article_id": 173 },
{ "image_id": 11848407, "article_id": 121 }
];
我尝试应用How can i merge array of objects with underscore js中描述的方法,但遗憾的是它根本不起作用。
我需要通过image_id
合并两个对象数组。
所以我尝试了这个:
_.values(
_.extendOwn(
_.indexBy(a, 'image_id'),
_.indexBy(b, 'image_id')
)
)
但输出只返回这个对象数组
我需要得到:
[
{"image_id": 631293, "score": 73, "article_id": 173},
{"image_id": 11848407, "score": 56, "article_id": 121}
]
如何在不循环检查数组的每个元素并使用findWhere
的情况下实现此目的?
答案 0 :(得分:2)
使用indexBy
是一个好的开始。然后循环并扩展一个:
var indexed = _.indexBy(a, 'image_id');
_.each(b, function(obj) {
var master = indexed[obj.image_id];
if (master) _.extend(master, obj);
});
或者如果你想要一个新的数组并让原始对象不受影响:
var result = _.map(b, function(obj) {
var master = indexed[obj.image_id];
return _.extend({}, master, obj);
});
var a = [{
"image_id": 11848407,
"score": 56
}, {
"image_id": 631293,
"score": 73
}, {
"image_id": "dummy",
"score": 1
}];
var b = [{
"image_id": "test",
"article_id": 0
}, {
"image_id": 631293,
"article_id": 173
}, {
"image_id": 11848407,
"article_id": 121
}];
var indexed = _.indexBy(a, 'image_id');
_.each(b, function(obj) {
var master = indexed[obj.image_id];
if (master) _.extend(master, obj);
});
console.log(a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
答案 1 :(得分:1)
您可以按如下方式使用_.zip
:
var a = [
{ "image_id": 631293, "score": 73 },
{ "image_id": 11848407, "score": 56 }
];
var b = [
{ "image_id": 631293, "article_id": 173 },
{ "image_id": 11848407, "article_id": 121 }
];
var c = _.zip(a, b).map(function(elem){
return _.extendOwn(elem[0], elem[1]);
});