2017-01-29 2 views
0

Допустим, у меня есть массив чисел и массивов, и я хочу расправляйте:Найти все возможные комбинации вложенных массивов

[1, [2, [3]] -> [1, 2, 3] 

легко. Теперь, скажем, я хочу, чтобы найти все возможные комбинации, таким образом, что в любой момент,

[a, [b, c]] -> [[a, b], [a, c]] 

я борюсь с поддержкой непредсказуемый и возможного высокого порядка сложности в этой структуре:

[1, [2, [3, 4]], [3, [4, [5, 6]], [7]] -> [[1, 2, 3], [1, 2, 4], [1, 3, 4, 5], [1, 3, 4, 6], [1, 3, 7] 

Так что это определенно проблема с картами/уменьшающимися возможностями, но я просто не могу обернуть вокруг себя голову.

+1

Что вы пробовали? – epascarello

+0

Это очень интересный вопрос, но было бы неплохо проверить, что вы уже что-то пробовали: D – briosheje

+0

Пожалуйста, повторите приведенный ниже пример! Это не имеет большого смысла. (почему '1' включен в' [1, 3, 4, 5] '?) –

ответ

1

Вы можете использовать итеративный и рекурсивный подход и собирать все части и нажимать, только если массив не найден в фактическом итерированном массиве.

function combine(array) { 
 
    var result = []; 
 
    array.forEach(function iter(r, p) { 
 
     return function (a, _, aa) { 
 
      if (Array.isArray(a)) { 
 
       a.forEach(iter(r, p + 1)); 
 
       return; 
 
      } 
 
      r = r.slice(0, p); 
 
      r[p] = a; 
 
      aa.some(Array.isArray) || result.push(r); 
 
     }; 
 
    }([], 0)); 
 
    return result; 
 
} 
 

 
console.log(combine([1, [2, [3]]]));       // [[1, 2, 3]] 
 
console.log(combine(['a', ['b', 'c']]));      // [["a", "b"], ["a", "c"]] 
 
console.log(combine([1, [2, [3, 4]], [3, [4, [5, 6]], [7]]])); // [[1, 2, 3], [1, 2, 4], [1, 3, 4, 5], [1, 3, 4, 6], [1, 3, 7]]
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Это не вполне определенный вопрос, но из приведенных данных я мог придумать следующий ответ, который работает просто отлично для предоставленных входного набора и должны сделать OK для подразумеваемой комбинации логика вопроса.

var arr = [1, [2, [3, 4]]], 
 
    brr = [1, [2, [3, 4]], [3, [4, [5, 6]], [7]]], 
 
flatNest = (a,p = []) => a.reduce((r,e,i,b) => Array.isArray(e) ? Array.isArray(b[i-1]) ? r.concat(flatNest(e,p)) 
 
                         : r 
 
                   : Array.isArray(b[i+1]) ? (r.push(...flatNest(b[i+1],[e]).map(f => p.concat(f))), 
 
                          p.push(e), 
 
                          r) 
 
                         : (r.push(p.concat(e)), 
 
                          r), []); 
 
console.log(JSON.stringify(flatNest(arr))); 
 
console.log(JSON.stringify(flatNest(brr)));

Смежные вопросы