按特定顺序列出所有可能的数组值组合
List all possible array value combinations in specific order
我对编程很新鲜,我正在编写一些代码来为我的论文生成各种值。我花了几天时间寻找我的问题的答案,但没有多少成功,我希望这个社区能够提供一些见解。
短版本:使下面的代码与输入数组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);
};
};
我已经研究了这里和这里的递归组合生成,但是我还没有能够使用这些方法考虑输入数组的元素位置。
感谢您的阅读。
- 你想要名字,所以你需要使用Map而不是Array。
- 由于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;
}
- 根据id将json数组组合为一个json数组
- jqueryeasyui使用子数组组合数据
- javascript数组中条目的成对组合
- 将数组中的所有数字组合相加
- JavaScript算法,提供每种可能的项目组合,并将它们存储在数组中
- 将两个数组合并为一个具有键值关系的数组
- 如何将数组的对象与同一索引组合
- 将对象隐藏到组合/对象数组
- 将数组组合到一个对象中
- D3.js键功能在简单的选择器/数组组合上运行两次
- 如何将两个 JSON 数组组合在一个 JSON 数组中
- 将JSON数组的一部分与另一个JSON数组组合在一起
- 如何将具有相同键的对象数组组合为一个对象
- Javascript数组组合变量值
- 数组组合以解决遍历问题
- Javascript中的循环函数在与perl数组组合时失败
- 使用javascript将一个对象数组组合为一个
- angarjs / javascript将两个长度相同的数组组合在一起
- 返回数组组合的数组的函数
- 如何使用ng中的if条件重复,并在ng选项中显示数组组合删除重复项