这不是我通常解决此类问题的方法,但也许您可以尝试这样的方法来获得一个组合(在伪代码中)。
假设您可以将对象称为 object[i][j],其中 i 是集合索引,j 是对象索引。总共有 X^N 种组合。
var result;
var sumPrevious;
for (var k = 0; k < Math.pow(x, N); k++) {
result = []; //array where we'll store one combination
sumPrevious = 0;
for (var i = 0; i < N; i++) {
objectIndex = Math.floor((k - sumPrevious) / Math.pow(x, N-i-1));
sumPrevious = sumPrevious + objectIndex * Math.pow(x, N-i-1);
result[i] = object[i][objectIndex];
}
if (result meets your criterion) {
return result; //return the first result that meets the criterion, which limits the number of iterations
}
}
我没有测试过,所以我不确定这段代码是否有效。但总的原则是正确的。每个组合都由一个从 0 到 x^N-1 的数字表示(伪代码中的 k)。然后我将此数字表示为“基本 X”数字。 N 个位置中每个位置的“数字”是每个集合中对象的索引。我检查组合是否符合条件并返回第一个符合条件的组合。
更新。下面的函数,其中矩阵参数表示 N 组 X 对象,返回所有可能的对象组合。如果您只返回满足您的标准的第一个结果而不是将其推送到 allCombinations 数组,您可能会得到您需要的第一个组合。
var combinations = function(x, N, matrix) {
var allCombinations = [];
var result;
var sumPrevious;
for (var k = 0; k < Math.pow(x, N); k++) {
result = []; //array where we'll store one combination
sumPrevious = 0;
for (var i = 0; i < N; i++) {
objectIndex = Math.floor((k - sumPrevious) / Math.pow(x, N-i-1));
sumPrevious = sumPrevious + objectIndex * Math.pow(x, N-i-1);
result[i] = matrix[i][objectIndex];
}
allCombinations.push(result);
}
return allCombinations;
}