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

时间:2016-09-09 18:07:44

标签: javascript arrays

由于我不确定这些概念是什么,以及所有“两个阵列/组合的组合”SO帖子都没有给出我期望的输出,所以很难用Google搜索。

示例数组:

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,但是我遇到了障碍,因为我不确定我到底在寻找什么。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

这解决了问题,但不知道它有多高效 - 我敢打赌,有更好的方法可以做到这一点。

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

答案 2 :(得分:0)

我会给你一些你可能会觉得有用的提示。首先,我假设您知道如何迭代数组:

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

您也可能无法将新阵列推送到现有的&#34; master&#34;阵列:

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

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

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