按特定顺序列出所有可能的数组值组合

List all possible array value combinations in specific order

本文关键字:数组 组合 有可能 定顺序      更新时间:2023-09-26

我对编程很新鲜,我正在编写一些代码来为我的论文生成各种值。我花了几天时间寻找我的问题的答案,但没有多少成功,我希望这个社区能够提供一些见解。

短版本:使下面的代码与输入数组arr的长度无关。

长版:

我有一个数组的数组,arr = [a, b, c, d],作为一个函数的输入,我想计算所有可能的组合(即a1,b1,c1,d1, a2,b1,c1,d1等),而不必知道arr中元素的确切数量。

问题是结果依赖于每个元素在arr中的位置。换句话说,arr (a, b, c, d)中的每个数组的名称必须能够在结果中被引用。为了清楚起见,说arr=[oil_price, countries, vessel_types]。然后,如果结果是随机的,并且顺序不同,那么就没有多大意义了,例如:

[ country[1], oil_price[1], vessel_type[1] ] (first pass)

[ vessel_type[2], country[1], oil_price[1] ] (second pass)

下面的代码确实考虑了arr中的元素位置,并创建了我想要的结果空间,但是每个元素都需要一个for循环,这是我试图避免的,因为arr中的元素数量可能会不时变化。

function resultspace(arr){
results = [];
e_id = 1;
for (count_1 = 0; count_1 < arr[0].length; count_1++){
    for (count_2 = 0; count_2 < arr[1].length; count_2++){
        for (count_3 = 0; count_3 < arr[2].length; count_3++){
            for (count_4 = 0; count_4 < arr[3].length; count_4++){
                for (count_5 = 0; count_5 < arr[4].length; count_5++){
                    for (count_6 = 0; count_6 < arr[5].length; count_6++){
                        id = e_id
                        var1 = arr[0][count_1].value;
                        var2 = arr[1][count_2].value;
                        var3 = arr[2][count_3].value;
                        var4 = arr[3][count_4].value;
                        var5 = arr[4][count_5].value;
                        var6 = arr[5][count_6].value;
                        result_instance = {id:e_id,
                                            VAR1: var1, 
                                            VAR2: var2, 
                                            VAR3: var3, 
                                            VAR4: var4, 
                                            VAR5: var5, 
                                            VAR6: var6
                                            };
                        results.push(result_instance);
                        e_id++;
                    };
                };
            };
        };
    };
return(results);
};
};

我已经研究了这里和这里的递归组合生成,但是我还没有能够使用这些方法考虑输入数组的元素位置。

感谢您的阅读。

  1. 你想要名字,所以你需要使用Map而不是Array。
  2. 由于for-in循环的顺序不能保证,所以您需要提供Array的名称。

工作演示http://jsfiddle.net/tarabyte/VLj7J/。

function permutate(arrays, keys, memo) {
    var options, name;
    if(keys.length ) {
        name = keys.shift();
        options = arrays[name];
        memo = memo || [{}];
        return permutate(arrays, keys, options.reduce(function(all, item){
            return all.concat(memo.map(function(curr){
                var result = copy({}, curr);
                result[name] = item;
                return result;
            }));
        }, []));
    }
    return memo;
}

按如下方式调用

permutate({name: [], age: [], gender: []}, ['age', 'name', 'gender']);

功能copy

function copy(to, from) {
    Object.keys(from).forEach(function(key){
        to[key] = from[key];
    });
    return to;
}

或经过额外预处理的{name: []}对数组http://jsfiddle.net/tarabyte/VLj7J/2/.

function permutate(data, memo) {
    var options, name;
    if(data.length ) {
        options = data.shift();
        for(name in options){
            options = options[name];
        }
        memo = memo || [{}];
        return permutate(data, options.reduce(function(all, item){
            return all.concat(memo.map(function(curr){
                var result = copy({}, curr);
                result[name] = item;
                return result;
            }));
        }, []));
    }
    return memo;
}