【问题标题】:finding available combinations (permutations?) of two arrays查找两个数组的可用组合(排列?)
【发布时间】:2016-09-09 18:07:44
【问题描述】:

很难在谷歌上搜索,因为我不确定这些概念叫什么,而且所有“两个数组/组的组合”SO 帖子都没有给我预期的输出。

示例数组:

var array1 = ['Bob', 'Tina'];
var array2 = [0, 100];

我可以通过两个数组找到可能的嵌套循环组合。但这会给我这样的输出:

var array1 = ['Bob', 'Tina'];
var array2 = [0, 100];
var options = []

array1.forEach(function (name) {
  array2.forEach(function (number) {
    options.push([name, number])
  })
})


console.log(options);
> [ [ 'Bob', 0 ], [ 'Bob', 100 ], [ 'Tina', 0 ], [ 'Tina', 100 ] ]

这篇文章 (Creating Combinations in JavaScript) 给了我上面的输出

但我真正想要的会给我这样的安排/组合:

[
  [['Bob', 0], ['Tina', 0]],
  [['Bob', 0], ['Tina', 100]],
  [['Bob', 100], ['Tina', 0]],
  [['Bob', 100], ['Tina', 100]]
]

它需要能够扩展更长的数组,但 2x2 是最简单的例子。

这里的笛卡尔示例 (Matrix combinations of two arrays in javascript) 也给了我分解的字符串和不相关的排列:

[ { '0': 'B', '1': 'o', '2': 'b' },
  { '0': 'B', '1': 'o', '2': 'b' },
  { '0': 'T', '1': 'i', '2': 'n', '3': 'a' },
  { '0': 'T', '1': 'i', '2': 'n', '3': 'a' } ]

我一直在浏览 google 和 SO,但我遇到了障碍,因为我不确定我真正在寻找什么。

【问题讨论】:

  • 某种形式的遍历两个数组是您将如何做到这一点的方式,但您需要展示到目前为止您已经尝试过的内容。见How to Askminimal reproducible example
  • 我建议手动使用不同的输入,并寻找可以利用的模式。作为一名程序员,至少做出一次好的尝试是在你的工作描述中。
  • 已编辑以包含更多信息和更多指向我尝试过的解决方案的链接。我的问题不只是进行组合,而是创建可能的选项,我可以在其中进行安排,例如 [['Bob', 0], ['Tina',0]]
  • 我注意到你需要双重排列。首先用第一个数组中的每个元素创建第二个数组中每个可能元素的集合,然后他们找到所有这些排列的组合

标签: javascript arrays


【解决方案1】:

我希望这可以帮助您获得实际的组合:

var array1 = ['Bob', 'Tina'];
var array2 = [0, 100];
var resultArray = []

for (var i = 0; i < array1.length; i++) {
  for (var j = 0; j < array2.length; j++) {
    var tempArray = [];
    tempArray.push(array1[i]);
    tempArray.push(array2[j]);
    resultArray.push(tempArray);
  }
}

for (var i = 0; i < array2.length; i++) {
  for (var j = 0; j < array1.length; j++) {
    var tempArray = [];
    tempArray.push(array1[j]);
    tempArray.push(array2[i]);
    resultArray.push(tempArray);
  }
}

console.log(resultArray);

【讨论】:

  • 谢谢,这确实给了我正在寻找的输出,这听起来像是上面有人提到的概念,找到组合选项,然后找到这些组合的组合。
  • 或者至少非常接近,我认为这+知道寻找双重排列给了我足够的运行。
  • 很高兴知道它对您有所帮助。
【解决方案2】:

我会给你一些提示,你可能会觉得有帮助。首先,我假设您知道如何遍历数组:

var array1 = ['Bob', 'Tina'];

for (var i = 0; i < array1.length; i++) {
    // you can access the ith element  using array1[i]
     // for example:
    alert(array1[i]);
}

我还假设您知道如何执行嵌套循环:

var array1 = ['Bob', 'Tina'];
var array2 = [0, 100];

for (var i = 0; i < array1.length; i++) {
    for (var j = 0; j < array2.length; j++) {
        alert(array1[i] + " " + array2[j]):
    }
}

你可能缺少的是如何构造一个新数组:

var five = 5;
var six = 6;

var myArray = [five, six];

您还可能缺少将新数组推送到现有“主”数组的功能:

var five = 5;
var six = 6;
var masterArray = [];

for (var i = 0; i < 10; i++) {
    masterArray.push([five, six]);
}

希望这会有所帮助,祝你好运!

【讨论】:

  • 谢谢,我已经根据其他反馈编辑了我的帖子,以包含我尝试过的类似选项。
  • 嵌套循环 + 推送到主数组的选项为我提供了可能的组合,例如 &gt; [ [ 'Bob', 0 ], [ 'Bob', 100 ], [ 'Tina', 0 ], [ 'Tina', 100 ] ],但我需要找到所有组合,包括 Bob 和 Tina 可以获得相同值的组合。
  • 原理相同,但需要 3 层循环。
【解决方案3】:

这解决了问题,但不知道效率如何 - 我敢打赌有更好的方法。

var array1 = ['Bob', 'Tina', 'Sam'];
var array2 = [0, 100, 200];

var resultCount = Math.pow(array2.length, array1.length);
var results = new Array(resultCount);
for(var i = 0; i < resultCount; i++) {
    results[i] = new Array(array1.length);
}

for(var row = 0; row < resultCount; row++) {
    for(var column = 0; column < array1.length; column++) {
        var result = row * array1.length + column;
        var category = array1.length * Math.pow( array2.length, array1.length - 1 - column);
        var idx = ~~(result / category) % array2.length;
        results[row][column] = [ array1[column], array2[idx] ];
	}
}
console.log(results);

我认为您实际上可以通过将 array2 视为基数(每个值映射到一个数字)并将 array1 视为数字的数量,从而在数字/字符串操作方面做到这一点。只要 array2 有 36 个或更少的元素,您就可以将每个数字从 0 转换为字符串的组合数 (Number.toString(radix)),然后将结果字符串中的每个字符转换回数组的索引。

【讨论】:

  • 这是 OP 所说的没有解决他们问题的确切算法。
  • @4castle 不再是 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多