Проблема в том, что во внутренних циклах вы пропускаете первый элемент (начиная с i<em>N</em> + 1
); что хорошо на первой итерации, но после этого будет пропущен неправильный элемент.
Итак, вместо этого вы можете проверить внешние индексы.
Использование операторов continue
для этого не необходимо , но при правильном использовании не замедляет l oop и не пропускает возможные случаи. Замедление происходит из-за того, что рабочая версия повторяет больше вариантов, а не из-за continue
.
const arr = [1, 2, 3, 4, 5, 6, 7];
for (let i1 = 0; i1 < arr.length; i1++) {
for (let i2 = 0; i2 < arr.length; i2++) {
if(i1 === i2) continue
for (let i3 = 0; i3 < arr.length; i3++) {
if([i1, i2].includes(i3)) continue
for (let i4 = 0; i4 < arr.length; i4++) {
if([i1, i2, i3].includes(i4)) continue
console.log(arr[i1] + ' ' + arr[i2] + ' ' + arr[i3] + ' ' + arr[i4]);
}
}
}
}
В качестве альтернативы вы можете использовать рекурсивную функцию (я очень рекомендую это), которая устраняет дублирование кода и делает его более гибким.
Вот код Я отправил на ваш предыдущий вопрос , но относится и к этому:
const variations = (arr, n = arr.length) => {
if(n === 0) return [[]]
if(!(n >= 0)) return []
const output = []
for(let i = 0; i < arr.length; i++){
if(arr.indexOf(arr[i]) < i) continue
const newArr = arr.slice()
newArr.splice(i, 1)
output.push(...variations(newArr, n - 1).map(e => [arr[i], ...e]))
}
return output
}
const arr = [1, 2, 3, 4, 5, 6, 7];
console.log(variations(arr, 4))
//If you want to concatenate them, use:
console.log(variations(arr, 4).map(e => e.join(' ')))
/* Just to make console fill the available space */
.as-console-wrapper{min-height: 100% !important;}