Update: После публикации этого ответа, я заметил, что existing answer был такой же подход, но я по-прежнему держать мои вокруг, так как это более многословным и даже рабочий код :)
Если у вас был только один экземпляр каждого элемента в исходном пуле элементов, а ваши элементы представляли двоичные цифры;
var items {
1 : 1,
2 : 1,
4 : 1,
8 : 1,
16: 1,
32: 1
};
Проблема будет упрощенной для генерации последовательности всех чисел, которые могут быть представлены этими цифрами:
- 0 ([] - нет элементов)
- 1 ([1])
- 2 ([2])
- 3 ([2, 1])
- 4 ([4])
- е дц
Таким образом, ваша проблема может рассматриваться как просто просим последовательности чисел, которые могут быть представлены. - не бинарным - но mixed-radix система счисления.
Это означает, что вы можете написать счетчик для этой странной системы нумерации, чтобы перебирать значения 0 и MAX. Таким образом, вы начнете с увеличения наименее значимой цифры и переноса на более значимую цифру, когда вы исчерпали все возможные значения, которые может принять цифра.
var items = {
1: 12, // we have 12 x item1
2: 1, // we have 1 x item2
3: 1,
4: 7,
5: 2,
6: 2
};
var counter = {
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0
};
function increment(digit) {
if (digit > 6) {
return false;
}
var value = counter[digit] + 1;
if (value > items[digit]) {
counter[digit] = 0;
return increment(digit + 1);
}
counter[digit] = value;
return true;
}
while (increment(1)) {
var set = [];
for (var digit in counter) {
var value = counter[digit];
for (var i = 0; i < value; i++) {
set.push(digit);
}
}
document.write("<div>" + set + "</div>");
}
Результат выглядит примерно так:
1
1,1
1,1,1
---- snip ----
2
1,2
1,1,2
---- big snip ----
1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
Что вы подразумеваете под «не каждый предмет должен существовать в результате?» Какие результаты вы точно ищете? –