2016-09-09 3 views
2

Я пытаюсь заставить функцию перестановок работать, но это меня сбивает с толку.Функция перестановки массива

пример набора данных:

{ 
    a: [1,2], 
    b: [1,2,3], 
    c: [1,2] 
} 

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

[ 
    [ 'a-1', 'b-1', 'c-1' ], 
    [ 'a-1', 'b-1', 'c-2' ], 
    [ 'a-1', 'b-2', 'c-1' ], 
    [ 'a-1', 'b-2', 'c-2' ], 
    [ 'a-1', 'b-3', 'c-1' ], 
    [ 'a-1', 'b-3', 'c-2' ], 
    [ 'a-2', 'b-1', 'c-1' ], 
    [ 'a-2', 'b-1', 'c-2' ], 
    [ 'a-2', 'b-2', 'c-1' ], 
    [ 'a-2', 'b-2', 'c-2' ], 
    [ 'a-2', 'b-3', 'c-1' ], 
    [ 'a-2', 'b-3', 'c-2' ], 
] 

До сих пор я итерация над Object, то итерация по Array для каждого key, а затем необходимо сделайте это все снова ..

Для начала я сломал ценности, словно так:

[ 
    [ 'a-1', 'a-2' ], 
    [ 'b-1', 'b-2', 'b-3' ], 
    [ 'c-1', 'c-2' ] 
] 

затем итерированного над ними:

var list_joined = [] 
var list = [] 
array.forEach((key, index) => { 
    key.forEach((value) => { 
     var tmp = [value] 
     array.forEach((_value, _index) => { 
      if(_index != index) { 
       tmp.push(_value[0]) 
      } 
     }) 
     tmp = tmp.sort() 
     if(list_joined.indexOf(tmp.join('_')) < 0) { 
      list_joined.push(tmp.join('_')) 
      list.push(tmp) 
     } 
    }) 
}) 

результат

[ 
    [ 'a-1', 'b-1', 'c-1' ], 
    [ 'a-1', 'b-1', 'c-2' ], 
    [ 'a-1', 'b-2', 'c-1' ], 
    [ 'a-1', 'b-3', 'c-1' ], 
    [ 'a-2', 'b-1', 'c-1' ] 
] 

Я не могу достаточно положить палец на том, где для исправления итерационного процесса.

ответ

2

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

function combine(object) { 
 

 
    function c(part, index) { 
 
     object[keys[index]].forEach(function (a) { 
 
      var p = part.concat(keys[index] + '-' + a); 
 
      if (p.length === keys.length) { 
 
       r.push(p); 
 
       return; 
 
      } 
 
      c(p, index + 1); 
 
     }); 
 
    } 
 

 
    var keys = Object.keys(object), 
 
     r = []; 
 

 
    c([], 0); 
 
    return r; 
 
} 
 

 
var data = { a: [1, 2], b: [1, 2, 3], c: [1, 2] }, 
 
    result = combine(data); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Спасибо! вопрос: вы просто пишете эту свободную руку или что-то подобное спрятали? – brod

+1

Это часть канона (меня). –