Jedna z propozycji z użyciem pętli for:
const firstDuplicate = numbers => {
for(let i = 0, max = numbers.length; i < max; i++) {
const current = numbers[i];
if(numbers.indexOf(current) !== numbers.lastIndexOf(current)) {
return i;
}
}
return 'Brak powtarzających się elementów.';
};
firstDuplicate([2,4,5,2,3,5,1,2,4]); //0
firstDuplicate([1,2,3,2,4,5]); //1
firstDuplicate([1,2,3,2,3,2,3]); //1
firstDuplicate([1,5,3,2,3,2,3]); //2
firstDuplicate([1,2,3,4,5]); //"Brak powtarzających się elementów."
albo inny wariant rozwiązania tego samego problemu bez zabawy z pętlą for:
const firstDuplicate2 = numbers => {
const first = numbers.findIndex((n,i) => {
return numbers.slice(i+1).includes(n);
});
return (first !== -1) ? first : 'Brak powtarzających się elementów.';
};
firstDuplicate2([2,4,5,2,3,5,1,2,4]); //0
firstDuplicate2([1,2,3,2,4,5]); //1
firstDuplicate2([1,2,3,2,3,2,3]); //1
firstDuplicate2([1,5,3,2,3,2,3]); //2
firstDuplicate2([1,2,3,4,5]); //"Brak powtarzających się elementów."
Wcale nie potrzebujesz dwóch pętli for, co więcej wg mnie to nie ma zupełnie sensu aby tak robić. W pierwszym przykładzie analizuję czy kolejny element ma swojego sobowtóra i jeśli tak to przerywam pętelkę i zwracam index tego elementu.
Drugi przykład robi to samo ale w nieco inny sposób, a mianowicie przeszukuję tablicę i przy każdym elemencie w dużym analizuję, czy jeśli na tym elemencie uciąć by tablicę to czy w dalszej jej części znajduje się co najmniej jedno wystąpienie tego elementu. Jeśli tak, to znaczy, że mamy sobowtóra. Tylko mała uwaga, findIndex zwróci albo index dopasowanego elementu albo -1, dlatego to dodatkowe sprawdzenie w instrukcji return.