Поиск возможностей выбора номера - PullRequest
3 голосов
/ 29 июля 2010

У меня есть следующие примеры данных в javascript:

var variations = [
  {group: 1, id: 1},
  {group: 1, id: 2},
  {group: 1, id: 3},
  {group: 1, id: 4},
  {group: 2, id: 5},
  {group: 2, id: 6},
  {group: 2, id: 7},
  {group: 3, id: 8},
  {group: 3, id: 9}
];

Допустим, я уже определил выбор, используя следующие переменные:

var selected_variation_groups = [1,2,3];
var selected_variation_group_ids = [1,2,3,4,5,6,7,8,9];

Когда я пытаюсь найти выборчисло возможностей из приведенных выше данных, тогда у меня будет 24 возможности:

=> 1, 5, 8
=> 1, 5, 9
=> 1, 6, 8
=> 1, 6, 9
=> 1, 7, 8
=> 1, 7, 9

=> 2, 5, 8
=> 2, 5, 9
=> 2, 6, 8
=> 2, 6, 9
=> 2, 7, 8
=> 2, 7, 9

=> 3, 5, 8
=> 3, 5, 9
=> 3, 6, 8
=> 3, 6, 9
=> 3, 7, 8
=> 3, 7, 9

=> 4, 5, 8
=> 4, 5, 9
=> 4, 6, 8
=> 4, 6, 9
=> 4, 7, 8
=> 4, 7, 9

Есть ли кто-нибудь, кто может помочь мне дать алгоритм для этого, или есть кто-нибудь, кто может помочь мне предоставить код JavaScript для их создания?возможности?

group s и id s могут быть неограниченными.

Ответы [ 3 ]

1 голос
/ 29 июля 2010

Вы вычисляете все варианты выбора одного элемента из каждой группы.

Кодирование проще, если все группы расположены в виде массива, поэтому все данные группы 1 находятся в одном массиве, группа 2 - в другом и т. Д.

Эта функция добавит всеперестановки групп в массив со значениями, разделенными запятыми.

var groups = [
      [1,2,3,4], [5,6,7], [8,9]
];

var result = new Array();
appendPermutation(groups, 0, groups.length, "", result);

alert(result.length);
alert(result);


function appendPermutation(groups, start, end, currentResult, result)
{
   if (start==end)
   {

       result.push(currentResult);
        return;
   }

   var group = groups[start];
   for (var i=0; i<group.length; i++) {
      var value = group[i].toString();
      var nextResult;
      if (currentResult.length==0)
          nextResult = currentResult + value;
      else
          nextResult = currentResult + "," + value;      
      appendPermutation(groups, start+1, end, nextResult, result);
   }
}
0 голосов
/ 29 июля 2010

В дополнение к решению @ mdma, вы также можете найти это полезным:

function permutation(options) {
    if(options.length == 1) {
        var permutations = [];
        for(var i = 0; i < options[0].length; i++) {
            permutations.push([options[0][i]]);
        }
        return permutations;
    }
    return addOptionWithPermutation(options[0], permutation(options.slice(1)));
}

function addOptionWithPermutation(option, permutations) {
    var newPermutations = [];
    for(var i = 0; i < option.length; i++) {
        for(var j = 0; j < permutations.length; j++) {
            var newPerm = permutations[j].slice(0); //just to take copy
            newPerm.splice(0, 0, option[i]); //insert in the beginning
            newPermutations.push(newPerm);
        }
    }
    return newPermutations;
}

var permutations = permutation([[1,2,3,4], [5,6,7], [8,9]]);

for(var i = 0; i < permutations.length; i++) {
  alert(permutations[i]);
}
0 голосов
/ 29 июля 2010

МДМА уже показала, как получить перестановку. Этот код сгруппирует данные в коллекцию хэшей, как рекомендовано:

var groups = {};
for(var i = 0; i < variations.length; i++){
    var key = variations[i].group;
    var value = variations[i].id;

    if(!groups[key])
        groups[key] = [];
     groups[key].push(value);
}

Если вам нужно изменить массив groups = {}; на groups = [];, но убедитесь, что ключи являются маленькими числами, или он может генерировать большой массив (для большого числа), или добавьте свойства (для других строк).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...