【问题标题】:JavaScript group a series of objsJavaScript 对一系列 obj 进行分组
【发布时间】:2021-07-03 04:31:09
【问题描述】:

我有以下代码,其中我有一组 obj b 是它们的分组方式在 a 中由 elements 定义。

我对如何做到这一点有些疑问。 例如滚动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)

【问题讨论】:

  • 一行就能搞定:const c = a.map(item => b.filter(obj => item.elements.includes(obj._id)));
  • 在你的结果中,id为cccx的对象排在最后,但在elements中,id cccx在zzzx之前,是否有原因交换订单或者是这个无意间做的?
  • @NickParsons:对于它需要我使用它的用途,排序是有影响的。但我认为从后端传给我的数据没有排序,例如元素内部的顺序,它可能不匹配,因为我有所有的 objs。作为一个将 b 用于对象的想法,我一直要求我在 b 中有对象。不知道我解释的好不好。

标签: javascript arrays dictionary object reduce


【解决方案1】:

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

// Transform `b` into a Map of the form:
Map {
  'aasa' => {
    _id: 'aasa',
    info: "sssas"
  },
  'bb' => {
    _id: 'bb'
  }
  // ... etc ...
}

然后,对于a 中的每个对象,您可以映射elements 数组,并使用该对象的id 作为查找对象中的键来获取具有该id 的关联对象。在执行映射之前,您可以先在 Map 上使用 .has 过滤查找表中不存在的任何键(即:id):

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' } ];

const lut = new Map(b.map(obj => [obj._id, obj]));
const res = a.map(({elements}) => elements.filter(key => lut.has(key)).map(key => lut.get(key)));
console.log(res);

【讨论】:

  • 请问您为什么建议创建一个查找对象而不是简单地做:const c = a.map(item => b.filter(obj => item.elements.includes(obj._id)));(或类似的东西)?
  • @secan 对于更大的数据集,使用 Map 可以提高效率(map() 然后 filter() 与 .includes() 的时间复杂度为 O(|a| * |b | * |elements|),而上述方法的时间复杂度为 O(|b| + |a| * |elements|)
【解决方案2】:

这应该可以工作

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

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2012-05-05
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多