Możesz porozmawiać z nauczycielem o tym, że to rozwiązanie -- trzymanie haseł w tablicy w pliku .JS -- jest nie tylko skrajnie niebezpieczne, ale i zupełnie oderwane od rzeczywistości. Tak po prostu nie wolno robić.
Mówię to nawet będąc entuzjastą i w zasadzie profesjonalnym programistą JavaScriptu.
Nie znaczy to wszystko, że ćwiczenie jest głupie i nieadekwatne. Gdy ktoś się uczy, to często pisze niepraktyczne programy. Warto jednak pewne rzeczy zaznaczyć. Np. kwestie bezpieczeństwa. Są one niezmiernie istotne w programowaniu webowym, a tutaj mówimy o elementarnych podstawach bezpieczeństwa. Tak trywialnych, że nikomu na rozsądnym poziomie umiejętności nie powinno wpaść do głowy, by hasła trzymać w tablicy w skrypcie JS. Zadanie może być niezłym ćwiczeniem, bo np. skorzystasz sobie z tablicy obiektów, tak jak to radził @massther:
var credentialsForAllUsers = [
{
login: '[email protected]',
password: 'haslostefana'
},
{
login: '[email protected]',
password: 'haslozbycha'
}
];
(jakbyś nie wiedział: credentials to z angielskiego "dane uwierzytelniająca", wyraz popularny gdy piszesz kod autoryzacyjny ;) )
Albo z tablicą tablic ("tablicą dwuwymiarową"):
var credentialsForAllUsers = [
[ '[email protected]', 'haslostefana' ],
[ '[email protected]', 'haslozbycha' ]
];
Powyższy zapis czysto tablicowy jest krótszy, ale korzystający z niego kod będzie mniej czytelny. Będziesz się odnosił do credentialsForAllUser[i][0]
oraz do credentialsForAllUsers[i][1]
-- nic nie będzie świadczyło o tym, że w indeksie 0 jest login, a w 1 hasło.
Myślę, że ciekawym pomysłem byłoby zastosowanie mapy, czyli tak naprawdę zwykłego obiektu. Zaraz zademonstruję ile Ci to ułatwi. Kluczami w mapie będą loginy, a wartościami -- hasła.
Najpierw musisz wiedzieć, że klucze (nazwy własności) obiektów zapisujemy zwykle bez cudzysłowów czy apostrofów, ale jeśli klucz zawiera jakieś znaki specjalne (np. @, przecinek, kropka...) to wciąż pozostaje ważnym, poprawnym kluczem -- tyle że musimy otoczyć go cudzysłowami/apostrofami.
Więc obiekt z prostymi kluczami możesz zapisać na dwa sposoby:
// "normalnie", tj. bez apostrofów wokół kluczy:
var obiekt = {
wlasnoscA: 'Wartość A',
wlasnoscB: 'Wartość B'
};
// to samo co powyżej, tylko że z apostrofami:
var obiekt = {
'wlasnoscA': 'Wartość A',
'wlasnoscB': 'Wartość B'
};
Natomiast jeśli w kluczach masz dziwne znaki, to musisz użyć cudzysłowów/apostrofów:
var obiektZDziwnymiKluczami = {
'ąę!!#$#@# dziwny klucz A': 'Wartość dziwnego klucza A',
'Dziwny klucz B': 'Wartość dziwnego klucza B
};
Dzięki temu, że apostrofy pozwalają na to, by kluczami obiektów były dowolne ciągi, możemy wykorzystać klucze do zapisywania dowolnych haseł, o tak:
var credentialsMap = {
'[email protected]': 'haslostefana',
'[email protected]': 'haslozbycha'
};
I teraz zobacz jak ultra-łatwo sprawdzić, czy "w bazie" (mapie) mamy użytkownika o loginie suppliedLogin
i czy hasło tego użytkownika odpowiada wartości zmiennej suppliedPassword
(zakładamy, że suppliedLogin
oraz suppliedPassword
to dane wprowadzone przez użytkownika, który chce się zalogować):
if (credentialsMap.hasOwnProperty(suppliedLogin)
&& credentialsMap[suppliedLogin] === suppliedPassword) {
alert('Dane się zgadzają -- zalogowałeś się!');
}
Nie trzeba robić pętli, nie trzeba używać indexOf
.
BTW: żeby nie było, że uważam Twojego nauczyciela za ciumoka: z Twojego kodu wnioskuję, że uczy Was dziedziczenia prototypowego i wyrażeń regularnych, w dodatku w tej lepszej składni (za pomocą literałów). I każde deklarować wszystkie zmienne za pomocą var
. To bardzo rozsądne rzeczy do nauczenia się i wielu ludzi kodujących z JS je olewa, a szkoda. Jeśli jesteś w szkole średniej, a nie na studiach, to to tym bardziej imponuje. Tym większa szansa, że rozsądny nauczyciel przyzna Ci rację, że warto chociaż krótko wspomnieć uczniom: hej, my się na razie tylko uczymy kodować, a to miał być tylko ciekawy przykład. W rzeczywistości dane logowania sprawdzajcie zawsze po stronie serwera, nigdy po stronie JS.