首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找嵌套数组的所有可能组合

查找嵌套数组的所有可能组合
EN

Stack Overflow用户
提问于 2017-01-30 01:22:56
回答 2查看 285关注 0票数 0

比方说,我有一个由数字和数组组成的数组,我想要扁平化它:

代码语言:javascript
复制
[1, [2, [3]] -> [1, 2, 3]

很简单。现在,比方说,我想找到所有可能的组合,这样,在任何时候,

代码语言:javascript
复制
[a, [b, c]] -> [[a, b], [a, c]]

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

代码语言:javascript
复制
[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]

所以这绝对是map/reduce-able的问题,但我就是不能理解它。

EN

回答 2

Stack Overflow用户

发布于 2017-01-30 03:24:53

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

代码语言:javascript
复制
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]]
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN

Stack Overflow用户

发布于 2017-01-30 22:29:57

这不是一个完美定义的问题,但从给定的数据中,我可以得出以下答案,它对于提供的输入集很好,对于问题背后的隐含组合逻辑应该也很好。

代码语言:javascript
复制
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)));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41923775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档