我有一系列的索引和品种,我想列出一个可能的排列列表



我想写一个函数,根据我的规则列出排列列表,每个索引都可以有一个数字作为值,并且结果中的索引不应该重复,如下所示:我有一个这样的数组:

[
{ index: 'a', varieties: [ 10 ] },
{ index: 'b', varieties: [ 5 ] },
{ index: 'c', varieties: [ 5, 8 ] },
{ index: 'd', varieties: [ 2, 6 ] },
]

我的结果将是这样一个数组:

[
'a10b5c5d2',
'a10b5c5d6',
'a10b5c8d2',
'a10b5c8d6'
]

我试着循环,但这是一个奇怪的问题,我不明白这个概念,怎么做。抱歉英语不好

也许从递归的角度考虑这一点更容易。对于每个元素和每个元素的每个变体,您需要将index + variety预先添加到下一个数组元素等的所有组合中。

const data = [
{ index: 'a', varieties: [ 10 ] },
{ index: 'b', varieties: [ 5 ] },
{ index: 'c', varieties: [ 5, 8 ] },
{ index: 'd', varieties: [ 2, 6 ] },
];
function compute(data, i) {
if (i === data.length) {
return [''];
}
return data[i].varieties
.map(v => compute(data, i+1).map(c => data[i].index + v + c))
.flat();
}
console.log(compute(data, 0));

您可以在没有递归的情况下获得笛卡尔乘积。

const
data = [{ index: 'a', varieties: [10] }, { index: 'b', varieties: [5] }, { index: 'c', varieties: [5, 8] }, { index: 'd', varieties: [2, 6] }],
result = data
.map(({ index, varieties }) => varieties.map(v => index + v))
.reduce((a, b) => a.reduce((r, v) => r.concat(b.map(w => [].concat(v, w))), []))
.map(a => a.join(''));
console.log(result);

最新更新