我使用NodeJS从Postgres数据库中提取选项,数据库的非常简化示例在这里:
OPTIONS
label choices
style [{label: 'Flat'}, {label: 'J', price: 10}, {label: 'Curved', price: 20}]
color [{label: 'Black'}, {label: 'Purple'}, {label: 'Blue'}, {label: 'Orange', price: 40}]
从数据库中提取后的JSON版本
var options = [
{label: 'style', choices: [{label: 'Flat'}, {label: 'J', price: 10}, {label: 'Curved', price: 20}]},
{label: 'color', choices: [{label: 'Black'}, {label: 'Purple'}, {label: 'Blue'}, {label: 'Orange', price: 40}]}
];
生成的变化
[
{ style: {label: 'Flat'}, color: {label: 'Black'} },
{ style: {label: 'Flat'}, color: {label: 'Purple'} },
{ style: {label: 'Flat'}, color: {label: 'Blue'} },
{ style: {label: 'Flat'}, color: {label: 'Orange', price: 40} },
{ style: {label: 'J', price: 10}, color: {label: 'Black'} },
{ style: {label: 'J', price: 10}, color: {label: 'Purple'} },
{ style: {label: 'J', price: 10}, color: {label: 'Blue'} },
{ style: {label: 'J', price: 10}, color: {label: 'Orange', price: 40}},
{ style: {label: 'Curved', price: 20}, color: {label: 'Black'} },
{ style: {label: 'Curved', price: 20}, color: {label: 'Purple'} },
{ style: {label: 'Curved', price: 20}, color: {label: 'Blue'} },
{ style: {label: 'Curved', price: 20}, color: {label: 'Orange', price: 40} },
]
我写了一个递归函数来生成变体。
function getCombinations(options, optionIndex, results, current) {
var maxResults = 5;
var allKeys = Object.keys(options);
var optionKey = allKeys[optionIndex];
var vals = options[optionKey];
for (var i = 0; i < vals.length; i++) {
current[optionKey] = vals[i];
if (optionIndex + 1 < allKeys.length) {
getCombinations(options, optionIndex + 1, results, current);
} else {
// Clone the object
var res = JSON.parse(JSON.stringify(current));
results.push(res);
}
}
return results;
}
var variations = await getCombinations(options, 0, [], {});
递归函数适用于小型数据集,但是一旦你开始添加更多变异因子,在我的情况下,我有20个具有各种选择的集合,我认为有数千个可能的10个变种,它开始崩溃计算机说内存堆已用尽。
我试图找出一个递归函数,可以将进程分解为批次,这样我就可以一次生成500-1,000个变量,然后以某种方式迭代它们(通过分页或某种类型的索引)以及以某种高效的方式计算潜在变化的总数。
您可以在此处找到完整的数据库示例:
https://www.db-fiddle.com/f/dLfzW8MptLhR7SxcP4J3TH/0
它需要在节点中运行而不会因为完整的数据库示例而崩溃。