Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从数组中创建一个组合并将其转换为javascript中的多维排列?_Javascript_Arrays_Subset_Combinations - Fatal编程技术网

从数组中创建一个组合并将其转换为javascript中的多维排列?

从数组中创建一个组合并将其转换为javascript中的多维排列?,javascript,arrays,subset,combinations,Javascript,Arrays,Subset,Combinations,源阵列: var arr1 = ["a", "b"]; var arr2 = ["c"]; var arr3 = ["d", "e", "f"]; 我可以做排列:(无重复) 但如何获得类似排列的结果? ["a", "c"], ["a", "d"], ["a", "e

源阵列:

var arr1 = ["a", "b"];
var arr2 = ["c"];
var arr3 = ["d", "e", "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)

我真的非常感谢您的帮助。

这是没有
eval的代码

var arr1=['a','b'];
var arr2=['c'];
var arr3=['d','e','f'];
var arr4=['x','y','z'];
梳=[arr1,arr2,arr3,arr4]
conc=梳状扁平()
resx=[]
函数permut(){//数组数

对于(设i=0;i,您希望从数组选择中获得长度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;
}

你想要组合还是置换?这回答了你的问题吗?这看起来根本不像置换。更像是来自长度为2的所有子序列的组合。@ParthVaswani我会说我需要组合中的置换。@Bergi oh..arr3中缺少“f”。我会很快用结果更新问题。我非常确定OP不想使用
eval
,这是为什么?该代码按预期工作,使用
eval
获得否决票确实不公平
eval
有风险,但在这种情况下,就我而言,没有风险know@Sven.hig考虑到数组的数量可能会有所不同,是否可以循环数组的长度而不是声明ring?@Bergi请随意推荐任何需要的更改或改进。非常有趣,我从中学到了很多,你在第一个区块检查阵列的长度也很好。我相信这是我的答案。
// 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));