JavaScript中的笛卡尔对象数组

jv2fixgn  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(97)

我一直在用下面的对象数组做笛卡尔积。

[
    {
        "name": "Size",
        "values": ["10", "39"]
    },
    {
        "name": "Color",
        "values": ["Yellow", "Pink"]
    },
    {
        "name": "Country",
        "values": ["USA", "UK"]
    }
]

我想生成这些属性的笛卡尔积,这样输出就是一个如下形式的数组:

[
    [
      { id: 1, name: 'Size', value: '10' },
      { id: 2, name: 'Color', value: 'Yellow' },
      { id: 3, name: 'Country', value: 'USA' },
    ],
    [
      { id: 1, name: 'Size', value: '10' },
      { id: 2, name: 'Color', value: 'Yellow' },
      { id: 3, name: 'Country', value: 'UK' },
    ],
    [
      { id: 1, name: 'Size', value: '39' },
      { id: 2, name: 'Color', value: 'Yellow' },
      { id: 3, name: 'Country', value: 'USA' },
    ],
    [
      { id: 1, name: 'Size', value: '39' },
      { id: 2, name: 'Color', value: 'Yellow' },
      { id: 3, name: 'Country', value: 'UK' },
    ],
    [
      { id: 1, name: 'Size', value: '10' },
      { id: 2, name: 'Color', value: 'Pink' },
      { id: 3, name: 'Country', value: 'USA' },
    ],
    [
      { id: 1, name: 'Size', value: '10' },
      { id: 2, name: 'Color', value: 'Pink' },
      { id: 3, name: 'Country', value: 'UK' },
    ],
    [
      { id: 1, name: 'Size', value: '39' },
      { id: 2, name: 'Color', value: 'Pink' },
      { id: 3, name: 'Country', value: 'USA' },
    ],  
    [ 
      { id: 1, name: 'Size', value: '39' },
      { id: 2, name: 'Color', value: 'Pink' },
      { id: 3, name: 'Country', value: 'UK' },
    ],  
  ];
6gpjuf90

6gpjuf901#

这里有一个简洁的递归方法:

const f = (xs, i = 1) =>
  xs.length === 0
    ? [[]]
    : f(xs.slice(1), i + 1).flatMap(y =>
        xs[0].values.map(value => [{ id: i, name: xs[0].name, value }, ...y]),
      )

console.log(
  f([
    {
      name: 'Size',
      values: ['10', '39'],
    },
    {
      name: 'Color',
      values: ['Yellow', 'Pink'],
    },
    {
      name: 'Country',
      values: ['USA', 'UK'],
    },
  ]),
)

输出:

[
  [
    { id: 1, name: 'Size', value: '10' },
    { id: 2, name: 'Color', value: 'Yellow' },
    { id: 3, name: 'Country', value: 'USA' }
  ],
  [
    { id: 1, name: 'Size', value: '39' },
    { id: 2, name: 'Color', value: 'Yellow' },
    { id: 3, name: 'Country', value: 'USA' }
  ],
  [
    { id: 1, name: 'Size', value: '10' },
    { id: 2, name: 'Color', value: 'Pink' },
    { id: 3, name: 'Country', value: 'USA' }
  ],
  [
    { id: 1, name: 'Size', value: '39' },
    { id: 2, name: 'Color', value: 'Pink' },
    { id: 3, name: 'Country', value: 'USA' }
  ],
  [
    { id: 1, name: 'Size', value: '10' },
    { id: 2, name: 'Color', value: 'Yellow' },
    { id: 3, name: 'Country', value: 'UK' }
  ],
  [
    { id: 1, name: 'Size', value: '39' },
    { id: 2, name: 'Color', value: 'Yellow' },
    { id: 3, name: 'Country', value: 'UK' }
  ],
  [
    { id: 1, name: 'Size', value: '10' },
    { id: 2, name: 'Color', value: 'Pink' },
    { id: 3, name: 'Country', value: 'UK' }
  ],
  [
    { id: 1, name: 'Size', value: '39' },
    { id: 2, name: 'Color', value: 'Pink' },
    { id: 3, name: 'Country', value: 'UK' }
  ]
]
66bbxpm5

66bbxpm52#

下面是基于前面答案的非递归解决方案

const data = [
    {
        "name": "Size",
        "values": ["10", "39"]
    },
    {
        "name": "Color",
        "values": ["Yellow", "Pink"]
    },
    {
        "name": "Country",
        "values": ["USA", "UK"]
    }
]

const combined = data.reduce((a,{name,values},i)=>{
    return a.flatMap(x => values.map(y=> x.concat({ id:i+1, name, value:y })))
},[[]])
 
 console.log(JSON.parse(JSON.stringify(combined)))

相关问题