Javascript 在Lodash中按条件合并两个JSON数组

Javascript 在Lodash中按条件合并两个JSON数组,javascript,ecmascript-6,lodash,Javascript,Ecmascript 6,Lodash,我有两个JSON数组,如: var a = [{_id:1, name: "Bhavin"},{_id:2, name: "Raj"},{_id:3, name: "Rahul"}]; var b = [{_id:1, post: "Developer"},{_id:2, post: "Quality Analyst"}]; 现在,我想合并如下: var c = [{_id:1, name: "Bhavin", post: "Developer"},{_id:2, name: "Raj

我有两个JSON数组,如:

var a = [{_id:1, name: "Bhavin"},{_id:2, name: "Raj"},{_id:3, name: "Rahul"}];    
var b = [{_id:1, post: "Developer"},{_id:2, post: "Quality Analyst"}];
现在,我想合并如下:

var c = [{_id:1, name: "Bhavin", post: "Developer"},{_id:2, name: "Raj", post: "Quality Analyst"},{_id:3, name: "Rahul"}];
我知道通过使用两个for循环,我可以在普通JavaScript中轻松地完成这项工作。。。但这需要
n*n
时间

我只想在
n
时间内解决这个问题


如何实现这一点?

O(n)
时间内,用纯Javascript实现这一点是很有可能的:

var a=[{{u id:1,名称:“Bhavin”},{{u id:2,名称:“Raj”},{u id:3,名称:“Rahul”}];
var b=[{u id:1,post:Developer},{u id:2,post:qualityanalyst}];
const aById=a.reduce((map,{u id,name})=>map.set({u id,name),newmap());
constbbyid=b.reduce((map,{u-id,post})=>map.set({u-id,post),newmap());
const combled=[…aById.entries()].map([\u id,name])=>{
const person={u id,name};
const post=bById.get(_id);
如果(post)person.post=post;
返回人;
});
控制台日志(组合)

var c=[{{u id:1,名称:“Bhavin”,帖子:“开发者”},{{u id:2,名称:“Raj”,帖子:“质量分析师”},{{u id:3,名称:“Rahul”}]很有可能在
O(n)
时间内用纯Javascript实现这一点:

var a=[{{u id:1,名称:“Bhavin”},{{u id:2,名称:“Raj”},{u id:3,名称:“Rahul”}];
var b=[{u id:1,post:Developer},{u id:2,post:qualityanalyst}];
const aById=a.reduce((map,{u id,name})=>map.set({u id,name),newmap());
constbbyid=b.reduce((map,{u-id,post})=>map.set({u-id,post),newmap());
const combled=[…aById.entries()].map([\u id,name])=>{
const person={u id,name};
const post=bById.get(_id);
如果(post)person.post=post;
返回人;
});
控制台日志(组合)
var c=[{{u id:1,名称:“Bhavin”,帖子:“开发者”},{{u id:2,名称:“Raj”,帖子:“质量分析师”},{{u id:3,名称:“Rahul”}]您应该使用
mergeWith
功能

var a=[{{u id:1,名称:“Bhavin”},{{u id:2,名称:“Raj”},{u id:3,名称:“Rahul”}];
var b=[{u id:1,post:Developer},{u id:2,post:qualityanalyst}];
//输出[{id:1,名称:“Bhavin”,帖子:“Developer”},{id:2,名称:“Raj”,帖子:“质量分析师”},{id:3,名称:“Rahul”}];
函数自定义程序(第一个值、第二个值){
返回Object.assign({},firstValue,secondValue);
}
console.log(u.mergeWith(a,b,customizer))
您应该使用
合并功能

var a=[{{u id:1,名称:“Bhavin”},{{u id:2,名称:“Raj”},{u id:3,名称:“Rahul”}];
var b=[{u id:1,post:Developer},{u id:2,post:qualityanalyst}];
//输出[{id:1,名称:“Bhavin”,帖子:“Developer”},{id:2,名称:“Raj”,帖子:“质量分析师”},{id:3,名称:“Rahul”}];
函数自定义程序(第一个值、第二个值){
返回Object.assign({},firstValue,secondValue);
}
console.log(u.mergeWith(a,b,customizer))

您好,您可以使用下面的代码实现它

_.map(a, function (el){
   return _.merge(el , _.find(b, {_id: el._id }))
})

// using chain, i would prefer first it looks clean :-p
_.chain(a).map(function (o){
   return _.merge(o, _.find(b, {_id: o._id }))
})
.value()

我将尝试使用chain并更新答案,您可以使用下面的代码实现它

_.map(a, function (el){
   return _.merge(el , _.find(b, {_id: el._id }))
})

// using chain, i would prefer first it looks clean :-p
_.chain(a).map(function (o){
   return _.merge(o, _.find(b, {_id: o._id }))
})
.value()

我将尝试使用chain并更新答案

您可以通过将较小大小的数组映射到由键值组成的对象来轻松解决此问题,其中对象的键是id,它们的值是关联的值本身。一旦关联完成,我们就可以通过分配映射对象中缺少的值来迭代和转换更大大小的数组

// ensure that b has more items than a
// to prevent data loss
if(a.length > b.length) {
  var t = b;
  b = a;
  a = t;
}

// create an object composed of of ids as key associated with each object.
// a loash alternative is: 
// var map = _.keys(a, '_id');
var map = a.reduce((r, v) => (r[v._id] = v, r), {});

// assign missing properties from each object from the associated mapped object.
var result = b.map(v => ({...map[v._id], ...v}));
var a=[{{u id:1,名称:“Bhavin”},{{u id:2,名称:“Raj”},{u id:3,名称:“Rahul”}];
var b=[{u id:1,post:Developer},{u id:2,post:qualityanalyst}];
//确保b的项目多于a
//防止数据丢失
如果(a.长度>b.长度){
var t=b;
b=a;
a=t;
}
//创建一个由ID组成的对象,作为与每个对象关联的键。
//另一种选择是:
//变量映射=u.keys(a,id');
var-map=a.reduce((r,v)=>(r[v.\u id]=v,r),{});
//从关联的映射对象中的每个对象指定缺少的特性。
var result=b.map(v=>({…map[v._id],…v}));
控制台日志(结果)

.as console wrapper{min height:100%;top:0}
您可以通过将较小大小的数组映射到由键值组成的对象来轻松解决此问题,其中对象的键是id,它们的值是相关联的值本身。一旦关联完成,我们就可以通过分配映射对象中缺少的值来迭代和转换更大大小的数组

// ensure that b has more items than a
// to prevent data loss
if(a.length > b.length) {
  var t = b;
  b = a;
  a = t;
}

// create an object composed of of ids as key associated with each object.
// a loash alternative is: 
// var map = _.keys(a, '_id');
var map = a.reduce((r, v) => (r[v._id] = v, r), {});

// assign missing properties from each object from the associated mapped object.
var result = b.map(v => ({...map[v._id], ...v}));
var a=[{{u id:1,名称:“Bhavin”},{{u id:2,名称:“Raj”},{u id:3,名称:“Rahul”}];
var b=[{u id:1,post:Developer},{u id:2,post:qualityanalyst}];
//确保b的项目多于a
//防止数据丢失
如果(a.长度>b.长度){
var t=b;
b=a;
a=t;
}
//创建一个由ID组成的对象,作为与每个对象关联的键。
//另一种选择是:
//变量映射=u.keys(a,id');
var-map=a.reduce((r,v)=>(r[v.\u id]=v,r),{});
//从关联的映射对象中的每个对象指定缺少的特性。
var result=b.map(v=>({…map[v._id],…v}));
控制台日志(结果)
作为控制台包装{min height:100%;top:0}
这不是仍然是O(n*n)?这不是仍然是O(n*n)?