Javascript 使用下划线.js基于1个字段合并2个对象
我有两个对象数组:Javascript 使用下划线.js基于1个字段合并2个对象,javascript,underscore.js,Javascript,Underscore.js,我有两个对象数组: 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 } ]; 我曾尝试应用中描述的方法,但不幸的是,它根本不起作用 由于ima
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 }
];
我曾尝试应用中描述的方法,但不幸的是,它根本不起作用
由于image\u id
,我需要合并两个对象数组
所以我试了一下:
_.values(
_.extendOwn(
_.indexBy(a, 'image_id'),
_.indexBy(b, 'image_id')
)
)
但输出只返回这个对象数组a
我需要得到:
[
{"image_id": 631293, "score": 73, "article_id": 173},
{"image_id": 11848407, "score": 56, "article_id": 121}
]
如果不执行循环检查数组的每个元素并在此处使用
findWhere
,如何实现这一点?使用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=[{
“图像id”:11848407,
“分数”:56
}, {
“图像id”:631293,
“得分”:73分
}, {
“图像id”:“虚拟”,
“分数”:1分
}];
变量b=[{
“图像id”:“测试”,
“文章id”:0
}, {
“图像id”:631293,
“第1条”:173
}, {
“图像id”:11848407,
“物品编号”:121
}];
var index=u.indexBy(一个“图像id”);
_.每个(b)功能(obj){
var master=索引的[obj.image_id];
如果(主)扩展(主,对象);
});
控制台日志(a)代码>
您可以按如下方式使用:
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]);
});
谢谢你的建议@Toucouleur如果未对其进行排序,则此操作不起作用,因为它未考虑图像\u id
。仅当源数组恰好进行了排序且一对一匹配时,此操作才起作用。基本上,这不是你的解决方案。同意评论。这将解决这个问题,但这只是因为两个数组中的数组元素是匹配的,这对于uz.zip来说是一个很好的用例,如文档《伟大的解决方案》中所述!