javascript - 从数组创建组合并将其转换为 javascript 中的多维排列?
问题描述
源数组:
var arr1 = ["a", "b"];
var arr2 = ["c"];
var arr3 = ["d", "e", "f"];
我可以做排列:(不重复)
["a", "c", "d"],
["b", "c", "d"],
["b", "c", "e"],
["b", "c", "f"],
["a", "c", "e"],
["a", "c", "f"]
但是我怎样才能得到结果排列呢?
["a", "c"],
["a", "d"],
["a", "e"],
["a", "f"],
["b", "c"],
["b", "d"],
["b", "e"],
["b", "f"],
["c", "d"],
["c", "e"],
["c", "f"]
我在这里只得到了我的单个数组排列片段
var arr3 = ['d', 'e', 'f'];
function permutation (list, n) {
var results = []
function _perm (list, n, res, start) {
if (res.length === n) {
return results.push(res.join(','))
}
if (start === list.length) { return }
_perm(list, n, res.slice(), start + 1)
res.push(list[start])
_perm(list, n, res, start + 1)
}
_perm(list, n, [], 0)
return results
}
console.log(permutation(arr3, 2)) // print ["e,f", "d,f", "d,e"]
由于源数组可能是无限的,我需要同时组合和排列它们。 我想知道像这样最好的实现是什么:
var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e', 'f'];
...
var arrN = ['x', 'y', 'z'];
permutation([arr1, arr2, arr3, arr4], 2)
permutation([arr1, arr2, arr3, arr4], 3)
permutation([arr1, arr2, arr3, arr4], 4)
我真的很感激任何帮助。
解决方案
您正在寻找从您选择的数组中获取长度为 N的子集,然后创建每个子集的笛卡尔积。
// returns power set of arr filtered by length
function powerset(arr, len, pref=[]) {
if (len == 0) return [pref];
if (len > arr.length) return [];
if (len == arr.length) return [pref.concat(arr)]; // premature optimisation
const next = arr.slice(1);
return powerset(next, len-1, [...pref, arr[0]]).concat(powerset(next, len, pref));
}
// returns cartesian product of the arrays in the argument
function cartesian(arg) {
var r = [], max = arg.length-1;
function helper(arr, i) {
for (var j=0, l=arg[i].length; j<l; j++) {
var a = arr.slice(0); // clone arr
a.push(arg[i][j]);
if (i==max)
r.push(a);
else
helper(a, i+1);
}
}
helper([], 0);
return r;
}
var arrays = [
['a', 'b'],
['c'],
['d', 'e', 'f'],
['x', 'y', 'z']
];
console.log(powerset(arrays, 2).flatMap(cartesian));
console.log(powerset(arrays, 3).flatMap(cartesian));
console.log(powerset(arrays, 4).flatMap(cartesian));
推荐阅读
- python - 请求属性
- sql-server - 将 SUM() 与 Where 子句一起使用的 SQL 命令
- swift - iOS 13:大型导航栏不使用栏色调颜色(默认为白色)
- jsf - 某些 UI 部分没有响应
- javascript - 在类外部定义变量与将其用作类内部的属性
- docker - 为什么“docker start”不允许参数为“-a stdin -a stdout”?
- go - 将结构字段的切片转换为可变参数
- android - 将上下文从自定义视图传递给类
- r - 如何添加一个变量来估计自第一次看到某人的天数比例
- mysql - Mysql join - 检查具有某些列值的不存在的行