2016-08-31 4 views
0

Я хочу, чтобы генерировать все возможные варианты продукт может быть на основе атрибутов, таких как цвет, размер и т.д. Я пытаюсь реализовать solution дается profitphp в javascript, но не получая желаемых результатов.Javascript: Подсчитать количество вариантов продукта на основе атрибутов

Вот что я реализовал:

var data = [['red', 'blue', 'green'],['small', 'medium', 'large']]; 

result = generateVariants(data); 
console.log(result); 

function generateVariants(data,prefix) { 
    if (typeof prefix === 'undefined') { 
     prefix = ''; 
    } 

    var result = []; 
    var attribute = data.shift(); 

    $.each(attribute, function(key,val) { 
     if (data instanceof Array && data.length > 0) { 
      result = result.concat(generateVariants(data, val + ' ')); 
     } 
     else { 
      result.push(prefix + val); 
     } 
    }); 

    return result; 
} 

Ожидаемый результат:

["red small", "red medium", "red large", "blue small", "blue medium", "blue large", "green small", "green medium", "green large"] 

Вместо этого, я получаю это:

["red small", "red medium", "red large", "blue", "green"] 

Любая помощь в значительной степени оценили. Благодарю.

+2

Все, что вам нужно, это рассчитать декартовое произведение вашего входного массива, чтобы получить возможные комбинации. Возможно, эта ссылка может помочь. Посмотрите на answer.http: //stackoverflow.com/questions/12303989/cartesian-product-of-multiple-arrays-in-javascript –

+0

@Farooq Спасибо, что указали мне в правильном направлении. – codeit

ответ

1

Вместо передачи исходного массива клонируйте его и передайте клонированный массив в качестве аргумента.

var data = [['red', 'blue', 'green'],['small', 'medium', 'large']]; 

    result = generateVariants(data); 
    console.log(result); 

    function generateVariants(data,prefix) { 
     if (typeof prefix === 'undefined') { 
      prefix = ''; 
     } 

     var result = []; 
     var attribute = data.shift(); 

     $.each(attribute, function(key,val) { 
      if (data instanceof Array && data.length > 0) { 




       // Instead of passing the original array, clone it and pass the cloned array as argument. 
    _data = data.slice(0); 



       result = result.concat(generateVariants(_data, val + ' ')); 
      } 
      else { 
       result.push(prefix + val); 
      } 
     }); 

     return result; 
    } 
+0

Он не работает для более чем 2 элементов массива. – codeit