查找两个数组的可用组合(排列?)
finding available combinations (permutations?) of two arrays
很难搜索到这个,因为我不确定这些概念是什么,所有的"两个数组/组的组合"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)
)的组合数,然后将结果字符串中的每个字符转换回数组的索引。
相关文章:
- 如何删除多行HTML排列中的空白
- 根据id将json数组组合为一个json数组
- 接受不在列表中的值-引导组合框
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 组合两个javascript函数
- Telerik rad组合框多列数据绑定
- 组合 2 个 JavaScript .scroll 函数
- 如何使用jquery组合两个数组
- onChange不足以从Dojo组合框触发查询
- 重新排列HTML元素的顺序并更改内容
- 组合承诺和非承诺值
- 所有控件的组合框
- 在D3中组合多个事件
- 如何使用排列运算符来获取具有命名参数的函数的所有参数
- AngularJS-如何只对多个事件的组合采取行动
- 根据组合框中选定的默认项目加载排列,并在更改选定项目时重新加载(淘汰)
- Javascript NodeJS ES6组合/排列算法
- JS + math:计算子字符串的排列或组合
- 查找两个数组的可用组合(排列?)
- 谷歌电子表格中的排列/组合