用JS进行组合分析:查找数组的组合

时间:2018-07-18 05:56:16

标签: javascript arrays

给出主数组“ arr”:

let arr = [1,2,3,4,5]

和“选项”数组:

let optArr1 = [1,3]
let optArr2 = [2,4,3]
let optArr3 = [1,4,2]
let optArr4 = [5]
let optArr5 = [2,3,4,5]

如何获取实际上满足主数组中所有数字的“选项”的所有可能组合?我需要的结果如下:

combination1 = [optArr1, optArr2, optArr4]
combination2 = [optArr1, optArr2, optArr5]
combination3 = [optArr1, optArr2, optArr3, optArr4]
combination4 = [optArr1, optArr2, optArr3, optArr5]
combination5 = [optArr1, optArr3, optArr5]
combination6 = [optArr2, optArr3, optArr4]
combination7 = [optArr2, optArr3, optArr5]

我已经用完了写条件以停止尝试新组合或实际编写执行组合分析的功能的想法。

为澄清起见:

我不是想让其他任何人都完成代码。足以说明如何从代码pov解决组合问题的一些观点。

2 个答案:

答案 0 :(得分:0)

一种未经优化的蛮力方法,通过使用选项检查临时数组的值。

  

结果是,您将获得一个数组(此处仅包含options数组的索引),该数组具有用于获取values数组的所有值的所有组合。

[
    [0, 1, 2, 3],
    [0, 1, 2, 4],
    [0, 1, 3],
    [0, 1, 4],
    [0, 2, 3],
    [0, 2, 4],
    [0, 3, 4],
    [0, 4],
    [1, 2, 3],
    [1, 2, 4],
    [2, 3, 4],
    [2, 4]
]

function getCombinations(values, options, size) {

    function fork(temp, index) {
        var itemSet = new Set;
        temp.forEach(a => a.forEach(v => itemSet.add(v)));
        if (itemSet.size === values.length) {
            result.push(temp);
            return;

        }
        if (index >= values.length) {
            return;
        }

        fork(temp.concat([options[index]]), index + 1);
        fork(temp, index + 1);
    }

    var result = [];
    fork([], 0);
    return result;
}

var values = [1, 2, 3, 4, 5],
    options = [[1, 3], [2, 4, 3], [1, 4, 2], [5], [2, 3, 4, 5]];

console.log(getCombinations(values, options, 3));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:-1)

在这里您需要调用concat函数。在这里,我做了concat方法。但是我不确定它是否真的匹配。在这里,我举一个ecombination1的示例

ecombination1 = optArr2.concat(optArr3).concat(optArr4);