Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用下划线.js基于1个字段合并2个对象_Javascript_Underscore.js - Fatal编程技术网

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来说是一个很好的用例,如文档《伟大的解决方案》中所述!