找到嵌套数组的所有可能组合

时间:2017-01-29 17:22:56

标签: javascript arrays recursion combinatorics

让我们说,我有一系列数字和数组,我想把它弄平:

[1, [2, [3]] -> [1, 2, 3]

很容易。现在,让我们说,我想找到所有可能的组合,以便在任何时候,

[a, [b, c]] -> [[a, b], [a, c]]

我正在努力支持这种结构中不可预测和可能的高度复杂性:

[1, [2, [3, 4]], [3, [4, [5, 6]], [7]] -> [[1, 2, 3], [1, 2, 4], [1, 3, 4, 5], [1, 3, 4, 6], [1, 3, 7]

所以它肯定是地图/减少能力的问题,但我无法绕过它。

2 个答案:

答案 0 :(得分:1)

您可以使用迭代和递归方法并收集所有部分,只有在实际迭代数组中找不到数组时才推送。



function combine(array) {
    var result = [];
    array.forEach(function iter(r, p) {
        return function (a, _, aa) {
            if (Array.isArray(a)) {
                a.forEach(iter(r, p + 1));
                return;
            }
            r = r.slice(0, p);
            r[p] = a;
            aa.some(Array.isArray) || result.push(r);
        };
    }([], 0));
    return result;
}

console.log(combine([1, [2, [3]]]));                           // [[1, 2, 3]]
console.log(combine(['a', ['b', 'c']]));                       // [["a", "b"], ["a", "c"]]
console.log(combine([1, [2, [3, 4]], [3, [4, [5, 6]], [7]]])); // [[1, 2, 3], [1, 2, 4], [1, 3, 4, 5], [1, 3, 4, 6], [1, 3, 7]]

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:0)

这不是一个完美定义的问题,但是根据给定的数据,我可以得出以下答案,该答案适用于所提供的输入集,并且应该对问题背后隐含的组合逻辑做好。



var  arr = [1, [2, [3, 4]]],
     brr = [1, [2, [3, 4]], [3, [4, [5, 6]], [7]]],
flatNest = (a,p = []) => a.reduce((r,e,i,b) => Array.isArray(e) ? Array.isArray(b[i-1]) ? r.concat(flatNest(e,p))
                                                                                        : r
                                                                : Array.isArray(b[i+1]) ? (r.push(...flatNest(b[i+1],[e]).map(f => p.concat(f))),
                                                                                           p.push(e),
                                                                                           r)
                                                                                        : (r.push(p.concat(e)),
                                                                                           r), []);
console.log(JSON.stringify(flatNest(arr)));
console.log(JSON.stringify(flatNest(brr)));