JavaScript组一系列obj

JavaScript组一系列obj,javascript,arrays,dictionary,object,reduce,Javascript,Arrays,Dictionary,Object,Reduce,我有下面的代码,其中我有一组objb是在a中通过元素定义它们的分组方式 我对怎么做有些怀疑。 例如,滚动a或b是否正确 你能帮我一下吗 const a = [{ _id: 0, elements: ['aasa', 'cccx', 'zzzx', 'sd'] }, { _id: 1, elements: ['bb', 'xx'] } ]; const b = [{ _id: 'aasa', info: "sssas"

我有下面的代码,其中我有一组obj
b
是在
a
中通过
元素定义它们的分组方式

我对怎么做有些怀疑。 例如,滚动
a
b
是否正确

你能帮我一下吗

const a = [{
    _id: 0,
    elements: ['aasa', 'cccx', 'zzzx', 'sd']
  },
  {
    _id: 1,
    elements: ['bb', 'xx']
  }
];

const b = [{
    _id: 'aasa',
    info: "sssas"
  },
  {
    _id: 'bb'
  },
  {
    _id: 'zzzx',
    info: "ssss"
  },
  {
    _id: 'cccx',
    info: "sss"
  },
  {
    _id: 'xx'
  }
];

// result
[
  [{
      _id: 'aasa',
      info: "sssas"
    },
    {
      _id: 'zzzx',
      info: "ssss"
    },
    {
      _id: 'cccx',
      info: "sss"
    }
  ],
  [{
      _id: 'bb'
    },
    {
      _id: 'xx'
    }
  ]
];

c = a.map(el => el.elements)


const p = b
  //.map(el => el.elements)
  .reduce(function(prev, curr) {
    //if
    prev.push(curr);
    return prev;
  }, []);

//console.log("End",p)

您可以首先将
b
更改为查找对象(这里我使用了a),其中每个id都是指向对象本身的键:

//将'b'转换为以下形式的映射:
地图{
‘aasa’=>{
_id:‘aasa’,
信息:“SSSA”
},
‘bb’=>{
_id:'bb'
}
//……等等。。。
}
然后,对于
a
中的每个对象,您可以映射到
元素
数组,并使用该对象的id作为查找对象中的键,以获取具有该id的关联对象。在执行映射之前,您可以先使用
筛选查找表中不存在的任何键(即:id)。映射上有

const a=[{u id:0,元素:['aasa','cccx','zzzx','sd']},{u id:1,元素:['bb','xx']};
常量b=[{u id:'aasa',info:'sssas},{u id:'bb'},{u id:'zzzx',info:'ssss'},{u id:'cccx',info:'sss'},{u id:'xx'}];
const lut=新映射(b.Map(obj=>[obj.\u id,obj]);
const res=a.map(({elements})=>elements.filter(key=>lut.has(key)).map(key=>lut.get(key));
控制台日志(res)这应该行得通

const c = a.map(el1 => {
   return b.filter(el2 => {
      return el1.elements.includes(el2._id)
   })
});

请问您为什么建议创建查找对象而不是简单地创建:
const c=a.map(item=>b.filter(obj=>item.elements.includes(obj.\u id))
(或类似的东西)@secan对于更大的数据集,使用Map可以提高效率(对于
Map()
然后
filter()
.includes()
将是O(| a |*| b |*| elements |),而上述方法的时间复杂度是O(| b |+| a |*| |*| elements |)您可以在一行中完成:
const c=a.map(item=>b.filter(obj=>item.elements.includes(obj.\u id)));
在您的结果中,id为
cccx
的对象排在最后,但在
元素中
id
cccx
排在
zzzx
之前,这是交换顺序的原因还是无意中完成的?@NickParsons:因为它需要我使用它,排序是有影响的。但我认为,我得到的数据从后端看,没有排序,例如,元素内部的顺序,可能不匹配,因为我有所有的Obj。我的想法是使用b作为对象,我一直在排序,我在b中有对象。我不知道我是否解释得很好。