У меня есть следующий массив в качестве примера;
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
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.