提问人:dacoten 提问时间:5/2/2023 最后编辑:James Zdacoten 更新时间:5/4/2023 访问量:116
Javascript 中的笛卡尔对象数组
Cartesian array of objects in Javascript
问:
我一直在研究一个笛卡尔乘积,其中包含以下对象数组。
[
{
"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' },
],
];
答:
1赞
Dogbert
5/2/2023
#1
以下是使用递归执行此操作的一种简明方法:
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' }
]
]
1赞
cmgchess
5/2/2023
#2
这是一个基于先前答案的非递归解决方案
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)))
评论