Создание комбинаций в JavaScript - PullRequest
3 голосов
/ 11 января 2012

Допустим, у меня есть несколько наборов опций в Javascript

var color  =  ["red", "blue", "green","yellow"];
var size   =  ["small", "medium", "large"];
var weight =  ["heavy", "light"];

, что является эффективным алгоритмом для получения всех комбинаций этих опций в массиве, который выглядит так:

["red and small and heavy", "red and small and light", "red and medium and heavy" ...]

Вот предостережение:

Эта функция должна иметь возможность принимать любое количество наборов опций

У меня такое ощущение, что правильный способ сделать это - черезсвоего рода обход дерева, но слишком рано, чтобы полностью обдумать это, и я еще не пил свой кофе

Ответы [ 4 ]

7 голосов
/ 11 января 2012
function permutations(choices, callback, prefix) {
    if(!choices.length) {
        return callback(prefix);
    }
    for(var c = 0; c < choices[0].length; c++) {
        permutations(choices.slice(1), callback, (prefix || []).concat(choices[0][c]));
    }
}

var color  =  ["red", "blue", "green","yellow"];
var size   =  ["small", "medium", "large"];
var weight =  ["heavy", "light"];

permutations([color, size, weight], console.log.bind(console));

Кажется, работает ...

[ 'red', 'small', 'heavy' ]
[ 'red', 'small', 'light' ]
[ 'red', 'medium', 'heavy' ]
[ 'red', 'medium', 'light' ]
[ 'red', 'large', 'heavy' ]
[ 'red', 'large', 'light' ]
[ 'blue', 'small', 'heavy' ]
[ 'blue', 'small', 'light' ]
[ 'blue', 'medium', 'heavy' ]
[ 'blue', 'medium', 'light' ]
[ 'blue', 'large', 'heavy' ]
[ 'blue', 'large', 'light' ]
[ 'green', 'small', 'heavy' ]
[ 'green', 'small', 'light' ]
[ 'green', 'medium', 'heavy' ]
[ 'green', 'medium', 'light' ]
[ 'green', 'large', 'heavy' ]
[ 'green', 'large', 'light' ]
[ 'yellow', 'small', 'heavy' ]
[ 'yellow', 'small', 'light' ]
[ 'yellow', 'medium', 'heavy' ]
[ 'yellow', 'medium', 'light' ]
[ 'yellow', 'large', 'heavy' ]
[ 'yellow', 'large', 'light' ]
3 голосов
/ 11 января 2012

Это будет декартово произведение этих множеств: http://en.wikipedia.org/wiki/Cartesian_product

Также см .: https://stackoverflow.com/questions/4796678/javascript-golf-cartesian-product

1 голос
/ 11 января 2012

Обход дерева - это путь, а точная рекурсия.

Принцип работы заключается в том, что на каждой глубине вы будете перебирать все опции для этой глубины, в вашем случае опции для списка,Когда вы выбираете элемент формы последней глубины, у вас есть один полный набор.

0 голосов
/ 07 октября 2012

Функция console.log, упомянутая в # 1 выше, должна иметь вид:

function log(message){
    if(typeof console == "object"){
        console.log(message);
    }
}

Затем измените вызов функции на:

combinations([color, size, weight], log);
...