Javascript 中二维数组的所有可能组合

问题描述 投票:0回答:3

所以我有一个充满变长数组的变长数组。例如这样的事情:

var arr2d = [
    ['red', 'blue'],
    ['cotton','polyester','silk'],
    ['large','medium','small']
]

我正在尝试从每个数组中获取一个的所有可能组合。所以答案应该是这样的:

var answer = [ ['red', 'cotton', 'large'], ['red', 'cotton', 'medium'], ['red', 'cotton', 'small'], ['red', 'polyester', 'large'], . . . ]

我已经研究了关于这个主题的其他答案,但它们都是用java编写的(我需要javascript),并且他们正在寻找所有组合,而不仅限于

length === arr2d.length

的组合。我已经看了这个近两个小时了,但我仍然想不出一种方法来递归地执行此操作。这是头部爆炸场景之一,因为两个数组的长度都不同(我有一个由这些二维数组组成的数组,我必须获得它们的组合)。在我列出的示例中,只有 18 种可能性,但实际上可能有数千种。

javascript arrays
3个回答
26
投票
使用递归函数时的另一个选择是在函数的参数中维护状态。这可以

有时使函数更容易理解:

var arr2d = [['red', 'blue'],['cotton','polyester','silk'],['large','medium','small']] function combos(list, n = 0, result = [], current = []){ if (n === list.length) result.push(current) else list[n].forEach(item => combos(list, n+1, result, [...current, item])) return result } console.log(combos(arr2d))


5
投票
这是一个递归解决方案。这个想法是获取第一个元素数组,在剩余元素数组上递归地查找组合,然后组合结果:

const arr2d = [ ['red', 'blue'], ['cotton', 'polyester', 'silk'], ['large', 'medium', 'small'] ]; function combinations(arr) { if (arr.length === 0) return [[]]; let res = [], [first, ...rest] = arr; let remaining = combinations(rest); first.forEach(e => { remaining.forEach(smaller => { res.push([e].concat(smaller)); }); }); return res; } console.log(combinations(arr2d));


0
投票
嗯嗯。 我强烈建议使用数学库来应对此类事情。

推荐的解决方案看起来会崩溃(调用堆栈)或永远挂起(没有中断的循环)给定不平凡的数据集。

而且就像两行代码:)

import {CartesianProduct} from './combinatorics.js'; console.log([...CartesianProduct.from(arr2d)]);
    
© www.soinside.com 2019 - 2024. All rights reserved.