查找两个数组的可用组合(排列?)

finding available combinations (permutations?) of two arrays

本文关键字:组合 排列 数组 两个 查找      更新时间:2023-09-26

很难搜索到这个,因为我不确定这些概念是什么,所有的"两个数组/组的组合"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 ] ]

这个帖子(在JavaScript中创建组合)给了我上面的输出

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

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

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

这个笛卡尔的例子(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' } ]

我一直在搜索谷歌和SO,但我遇到了障碍,因为我不确定我到底在找什么。

我希望这能帮助你得到你的实际组合:

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);

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

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]);
}

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

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

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))的组合数,然后将结果字符串中的每个字符转换回数组的索引。