У меня есть следующий массив в качестве примера;

let arr = [['red','blue','pink],['dog','cat','bird'],['loud', 'quiet']]

Мне нужно написать обобщенную функцию, которая печатает все комбинации одного слова из первого вектора, одного слова из второго вектора и т. Д. Я посмотрел некоторые коды здесь, но они все рекурсивные или работают только с определенным массивом. Как я могу написать этот код без рекурсии?

let allComb = function(arr) {
  if (arr.length == 1) {
    return arr[0];
  } else {
    let result = [];
    let arrComb = allComb(arr.slice(1));
    for (let i = 0; i < arrComb.length; i++) {
      for (let j = 0; j < arr[0].length; j++) {
        result.push(arr[0][j] + ' ' + arrComb[i]);
      }
    }
    return result;
  }
} 

allComb(arr)
2
momo 25 Апр 2017 в 04:29

2 ответа

Лучший ответ

В этой версии используется метод одного приращения за цикл без рекурсии.

let arr = [
  ['red', 'blue', 'pink'],
  ['dog', 'cat', 'bird'],
  ['loud', 'quiet']
];

function allComb(arr) {
  var total = 1;
  var current = [];
  var result = [];

  for (var j = 0; j < arr.length; j++) {
    total *= arr[j].length;
    current[j] = 0;
  }

  for (var i = 0; i < total; i++) {
    var inc = 1;
    result[i] = "";
    for (var j = 0; j < arr.length; j++) {
      result[i] += arr[j][current[j]] + ' ';
      if ((current[j] += inc) == arr[j].length)
        current[j] = 0;
      else
        inc = 0;
    }
  }
  return (result);
}
console.log(allComb(arr));
2
fmacdee 25 Апр 2017 в 02:45

Вы можете сделать следующее:

var arr = [['red','blue','pink'],['dog','cat','bird'],['loud', 'quiet']],
    res = arr.reduce((p,c) => p.reduce((r,x) => r.concat(c.map(y => x + " " + y)),[]));
console.log(res);
2
Redu 25 Апр 2017 в 02:21