javascript—如何优化创建两个数组项的所有可能组合的两个嵌套循环

luaexgnf  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(377)

此问题已在此处找到答案

javascript中多个数组的笛卡尔乘积(35个答案)
6小时前关门了。
我有两个对象数组,我想创建一个对象数组,表示前两个数组的所有可能组合。为了说明问题,假设我有一系列的产品在供应,一系列的产品在需求,我希望看到所有可能的供需组合。我正在使用node.js,但问题是语言不可知。
因此,如果我有:

const supply = [
  {
    id: '1',
    name: 'chair'
  },
  {
    id: '2',
    name: 'desk'
  }
];

const demand = [
  {
    id: '3',
    name: 'couch'
  },
  {
    id: '4',
    name: 'desks'
  }
]

我希望输出为:

[
  {
    id: '1-3',
    supply: 'chair',
    demand: 'couch'
  },
  {
    id: '1-4',
    supply: 'chair',
    demand: 'desks'
  },
  {
    id: '2-3',
    supply: 'desk',
    demand: 'couch'
  },
  {
    id: '2-4',
    supply: 'desk',
    demand: 'desks'
  }
]

为此,我实施了以下措施:

return supply.reduce((acc, supply) => {
  return acc.concat(
    demand.map(demand => {
      return {
        id: `${supply.id}-${demand.id}`,
        supply: supply.name,
        demand: demand.name
      }
    })
  )
}, []);

这很好,但是随着我的数据集变大(现在每个数组中有几百个项目,我很快就会有更多项目),它也会变得非常慢。
有没有办法优化这个?我想不出一种方法来实现这一点,而不是对第一个数组的每一项先遍历一个数组,然后遍历另一个数组。但也许我错过了什么?
如果我能提供更多信息,请告知。
任何帮助都将不胜感激!

vddsk6oq

vddsk6oq1#

代码可以大大简化为以下内容,这应该非常快。

demand.forEach((o, i) => {
    acc.push(
    {
        id: `${supply[i].id}-${o.id}`,
        supply: supply[i].name,
        demand: o.name
    })
})

相关问题