【发布时间】:2014-09-26 19:26:27
【问题描述】:
好的,过去几天我一直在为此烦恼。生成所有可能组合的数组的最简洁(没有巨大开销的任何东西)方法是什么
var input = [
{a: 1}, {a: 2, b: 3},
{b: 4}, {b: 5}, {a: 6}
];
所以我希望生成以下内容:
var output = [
{a: 1}, {b: 4}, {b: 5}, {a: 6},
{a: 1, b: 4}, {a: 1, b: 5},
{a: 6, b: 4}, {a: 6, b: 5},
{a: 2, b: 3}
];
问题是,在我的具体情况下,我正在谈论 4 个属性(实际上我需要为每组不同的属性集生成一个单独的数组,但是这些都是我以后应该能够自己实现的东西) .然而,我正在寻找的只是一些关于如何解决这个问题的通用伪代码,而不是有人为我编写它或类似的东西。
我觉得这应该是我应该能够弄清楚的事情,但我只是没有到达那里。首先,我为所有属性组合(所有a、所有b、所有c、所有ab、所有bc等)生成单独的数组。然而问题是,已经有了 3 个属性,接下来您必须为每个 a 添加所有 b's、c's 和 bc's。现在,为单个属性写出来很简单,但是为 n 属性写一个通用的解决方案让我完全无法理解。
【问题讨论】:
-
@Teemu:虽然我们谈论的是 4 个属性,但生成的项目总数将“只是”在 3000 左右(这绝对不会使现代浏览器崩溃,即使生成的数量项目将是 10 倍)。此外,我不确定你从哪里得到你的想法,这将在浏览器中运行(事实并非如此,在 node.js 中的应用程序设置上运行它)。
-
我想我没有关注您的输入与输出的关系或在您的情况下构成“组合”的内容。例如,为什么您的输出中没有
{a:2, b:4}?具有单个键值的对象和具有多个键/值对的对象有什么区别? -
@MikeBrant:关于您的第一个问题:因为输入中没有定义 {a:2}。多键/值对输入已经是两个项目的定义组合,如果它的长度等于属性的数量,则直接进入输出。但是,如果我们要讨论 3 个属性,它将与单个
c的所有可能值相结合。