Javascript 比较两个具有公共字段的数组,然后推送到具有相应分组字段的新数组

Javascript 比较两个具有公共字段的数组,然后推送到具有相应分组字段的新数组,javascript,node.js,Javascript,Node.js,这里是一般的编程问题 我有一个名为SPACES [ { _id: 5e1c4689429a8a0decf16f69, challengers: [ 5dfa24dce9cbc0180fb60226, 5dfa26f46719311869ac1756, 5dfa270c6719311869ac1757 ] }, { _id: 5e1c4eb9c9461510407d5e81, challengers: [ 5d

这里是一般的编程问题

我有一个名为
SPACES

[
  {
    _id: 5e1c4689429a8a0decf16f69,
    challengers: [
      5dfa24dce9cbc0180fb60226,
      5dfa26f46719311869ac1756,
      5dfa270c6719311869ac1757
    ]
  },
  {
    _id: 5e1c4eb9c9461510407d5e81,
    challengers: [ 5dfa24dce9cbc0180fb60226, 5dfa26f46719311869ac1756 ],
  }
]

这个数组称为
USERS

[
  {
    _id: 5dfa24dce9cbc0180fb60226,
    name: 'Account 1',
    email: 'account1@gmail.com',
    spaces: [ 5e1c4689429a8a0decf16f69, 5e1c4eb9c9461510407d5e81 ],
  },
  {
    _id: 5dfa26f46719311869ac1756,
    name: 'Account 2',
    email: 'account2@gmail.com',
    spaces: [ 5e1c4689429a8a0decf16f69, 5e1c4eb9c9461510407d5e81 ]
  },
  {
    _id: 5dfa270c6719311869ac1757,
    name: 'Account 3',
    email: 'account3@gmail.com',
    spaces: [ 5e1c4689429a8a0decf16f69 ]
  }
]
我想做的是,通过这两种方法,而不是使用
空格。challengers
数组只是
id
,我希望数组包含每个
用户
对象

例如,如果
用户
的ID位于
空格.challengers
数组中,则将该用户推入该数组(该数组将是整个对象)

到目前为止,我已经尝试过这个(我还不是很好):


然而,我并没有进入IF模块。(即使我这样做了,也不确定这是否有效,或者这是否是如何做到的)。做双重映射感觉很奇怪,因为我有这么多的迭代,它复制了我的推送(因为我没有逻辑来判断它是否被推送)

您可以使用

除了用于映射的对象的分解之外,这个答案还用于此部分

challengers: challengers.map(
    Map.prototype.get,                  // cb with a prototype and using `this`
    new Map(users.map(o => [o._id, o])) // thisArg
)
上述
Map
分为两部分

下半部分生成一个
Map
实例,其中用户项的
\u id
用作键,整个对象用作值。此实例用作第二个参数的
thisArg

上部是
Map
的原型,用作回调。虽然提供了
这个
对象,但不需要绑定()

var spaces=[{u id:'5e1c4689429a8a0decf16f69',挑战者:['5dfa24dce9cbc0180fb60226','5DFA26F467119311869AC1756','5dfa270c6719311869ac1757'],{u id:'5e1c4eb9c9461510407d5e81',挑战者:['5dfa24dce9cbc0180fb60226','5DFA26F467311869AC1756']],
用户=[{u id:'5dfa24dce9cbc0180fb60226',名称:'Account 1',电子邮件:'account1@gmail.com,空格:['5e1c4689429a8a0decf16f69','5e1c4eb9c9461510407d5e81'],{u id:'5dfa26f46719311869ac1756',姓名:'Account 2',电子邮件:'account2@gmail.com,空格:['5e1c4689429a8a0decf16f69','5e1c4eb9c9461510407d5e81'],{u id:'5dfa270c6719311869ac1757',姓名:'3号账户',电子邮件:'account3@gmail.com,空格:['5e1c4689429a8a0decf16f69']},
结果=spaces.map({u id,challengers})=>({
_身份证,
挑战者:challengers.map(
Map.prototype.get,
新映射(users.Map(o=>[o.\u id,o]))
)
}));
console.log(结果);

.as控制台包装{max height:100%!important;top:0;}
.map
应该可以在这里找到。保持简单

var空间=[
{
_id:“5e1c4689429a8a0decf16f69”,
挑战者:[
“5dfa24dce9cbc0180fb60226”,
“5dfa26f46719311869ac1756”,
“5dfa270c6719311869ac1757”
]
},
{
_id:“5e1c4eb9c9461510407d5e81”,
挑战者:[“5dfa24dce9cbc0180fb60226”,“5dfa26f46719311869ac1756”,“一些不存在”]
}
],
用户=[
{
_id:“5dfa24dce9cbc0180fb60226”,
名称:“账户1”,
电子邮件:“account1@gmail.com",
空格:[“5e1c4689429a8a0decf16f69”,“5e1c4eb9c9461510407d5e81”]
},
{
_id:“5dfa26f46719311869ac1756”,
名称:“账户2”,
电子邮件:“account2@gmail.com",
空格:[“5e1c4689429a8a0decf16f69”,“5e1c4eb9c9461510407d5e81”]
},
{
_id:“5dfa270c6719311869ac1757”,
名称:“账户3”,
电子邮件:“account3@gmail.com",
空格:[“5e1c4689429a8a0decf16f69”]
}
],
结果=spaces.map({u id,challengers})=>({
_身份证,
挑战者:挑战者。地图(挑战者=>
users.find(user=>user.\u id===challenger)
).filter(行=>行)
}));

console.log(JSON.stringify(result,null,2));
假设
Users
数组中的每个条目都有一个唯一的ID,我们可以构建一个
Hashmap
来存储
(ID,index)
对,以便在
空间
数组中循环时有效地从
Users
数组中搜索ID

let spaces=[{u id:'5e1c4689429a8a0decf16f69',挑战者:['5dfa24dce9cbc0180fb60226','5DFA26F467119311869AC1756','5dfa270c6719311869ac1757'],{u id:'5e1c4eb9c9461510407d5e81',挑战者:['5dfa24dce9cbc0180fb60226','5DFA26F467311869AC1756'],]
let users=[{{u id:'5dfa24dce9cbc0180fb60226',name:'Account 1',email:'account1@gmail.com,空格:['5e1c4689429a8a0decf16f69','5e1c4eb9c9461510407d5e81',},{u id:'5dfa26f46719311869ac1756',姓名:'Account 2',电子邮件:'account2@gmail.com,空格:['5e1c4689429a8a0decf16f69','5e1c4eb9c9461510407d5e81'],{u id:'5dfa270c6719311869ac1757',姓名:'3号账户',电子邮件:'account3@gmail.com,空格:['5e1c4689429a8a0decf16f69']
让IDIndexMapping={}//存储(_id,index)对,以提高搜索效率
for(让索引进入用户)//使用索引遍历用户数组
IDIndexMapping[users[index]。\u id]=index;//IDIndexMapping中的存储(\u id,index)对
//为了节省空间,我避免使用“map”和“vanilla”for“loop
//由于map返回一个新数组,但带有'for'循环,所以我们可以执行适当的更改
for(让outerIndex在空间中){//使用索引遍历`spaces`数组
让challengers=spaces[outerIndex].challengers;//获取challengers数组
for(让innerIndex在challengers中){//使用索引遍历challengers数组
let ID=challengers[innerIndex];//获取ID
if(ID在IDIndexMapping中)//ID在IDIndexMapping中是否存在
空格[outerIndex]。挑战者[innerIndex]=用户[IDIndexMapping[ID];//将ID更改为实际用户对象
}
}
console.log(空格)

输出

[{u id:'5e1c4689429a8a0decf16f69',
挑战者:[[Object],[Object],[Object]]},
{u id:'5e1c4eb9c9461510407d5e81',
挑战者:[[Object],[Object]]}]

您可以创建挑战者地图进行查找,然后将其放置在空格中

//创建用户
challengers: challengers.map(
    Map.prototype.get,                  // cb with a prototype and using `this`
    new Map(users.map(o => [o._id, o])) // thisArg
)
userMap = users.reduce((res, val) => ({
  ...res,
  [val._id]: val
}), {});
inflatedSpaces = spaces.map(s => ({ ...s, challengers: s.challengers.map(c => userMap[c]) }));