从NodeJS中的对象数组中生成变量列表的高效方法(10,000+个潜在变体)

时间:2018-05-10 02:19:42

标签: node.js postgresql

我使用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

它需要在节点中运行而不会因为完整的数据库示例而崩溃。

0 个答案:

没有答案