让我们说,我有一系列数字和数组,我想把它弄平:
[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]
所以它肯定是地图/减少能力的问题,但我无法绕过它。
答案 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)));