Можно было бы ограничиться рекурсивной переделкой варианта
j0hnik:
function generate(arr, i, value, result){
if(!result){
return generate(arr, i, '', []);
}
if(!i--) {
return result.push(value);
};
for(var k = 0; k < arr.length; k++){
generate(arr, i, value + arr[k], result);
}
return result
}
console.log(generate(['A','B','C','D','E'], 4))
Но на самом деле тут просто нужно добавить капельку математики:
function generate(arr, n){
var length = arr.length,
result = new Array(Math.pow(length, n));
for(var i = result.length, temp = new Array(n), j; i--;){
j = n;
while(j--){
temp[j] = arr[i / Math.pow(length, j) % length | 0];
}
result[i] = temp.join('');
}
return result
}
console.log(generate(['A','B','C','D','E'], 4));