Proszę o pomoc z zadaniem o Tablicach Asocjacyjnych w JavaScript

0

Zadanie:
Załóż kartę Klienta w postaci tablicy asocjacyjnej - zapisuj w niej numery pokojów zajmowanych przez konkretnych gości. Oto nazwiska gości i ich pokoje: Kowalski - 1, Nowak - 3, Kronung - 4. Następnie pobierz dane wejściowe przez prompt() (w polu pod kodem wpisz istniejące nazwisko) i wyświetl na ekranie numer pokoju należący do wybranego gościa. Nie musisz w tej chwili obsługiwać sytuacji, że taki Klient nie istnieje.

Nie skończyłem jeszcze kodu, ale tyle udało mi się napisać:

var karta_klienta = prompt()
var karta_klienta = [
Kowalski = 1,
Nowak = 3,
Kronung = 4,
];
console.log();


0

tablica asocjacyjna w JS to po prostu obiekt.

var karta_klienta = {
  "Kowalski":1,
  "Nowak":3,
  "Kronung":4,
}
0

w przypadku używania obiektów jako "tablicy asocjacyjnej" lepiej ich używać tworząc Object.create(null) żeby uniknąć dziedziczenia właściwości typu toString czy innych z przodka Object (ew. używać hasOwnProperty).

są jeszcze mapy:

const kartaKlienta = new Map;
kartaKlienta.set('Kowalski', 1);
kartaKlienta.set('Nowak', 3);
kartaKlienta.set('Kronung', 4);
alert(kartaKlienta.get('Kronung'));

https://codepen.io/anon/pen/EvvNXz

var karta_klienta = prompt()
var karta_klienta = [

Dwa razy deklarujesz tę samą zmienną. Co gorsza używasz var które nawet nie zgłosi błędu (a powinno, bo zwykle takie zachowanie to błąd, niezrozumienie działania języka albo niechlujność - dlatego nowsze instrukcje let oraz const zwracają błąd jak się próbuje coś dwa razy zadeklarować).

więc tak by wystarczyło:

var karta_klienta = prompt()
karta_klienta = [

Ale z drugiej strony zmienna karta_klienta nie pasuje do pierwszej linijki, bo przyjmujesz nazwisko, a nie kartę klienta, więc jakiś straszny chaos masz. Lepiej by było:

var nazwisko = prompt() 
var karta_klienta = [

no i naprawdę let czy const byłyby lepsze, są łatwiejsze w użyciu po prostu (chociaż trochę inaczej działają niż var).

No i zwykle zmienne się pisze po angielsku, bo tak jest praktyczniej, ale to już uwaga pozatechniczna.

0

@LukeJL

w przypadku używania obiektów jako "tablicy asocjacyjnej" lepiej ich używać tworząc Object.create(null)

Polemizowałbym. Używanie Object.create(null) jest wg mnie bardzo niewygodne i nieczytelne, szczególnie, gdy tworzymy zagnieżdżone struktury (podobnie z Map) - w teori są fajne, ale niepraktyczne. Literały mimo pewnego (niewielkiego) kosztu są wg mnie najwygodniejsze (i i tak ich nie unikniesz, chociażby pracując na JSONach i JSON.parse()).

0

Też często używam samych literałów, szczególnie wtedy, kiedy i tak literuję po Object.keys a nie dostaję się do nich bezpośrednio.

Co nie zmienia tego, że nie zawsze się dobrze nadają do tego rodzaju rzeczy, bo można łatwo popaść w konflikt nazw (w przypadku OPa to i tak nie ma znaczenia, ale tak ogólnie - powiedzmy, że ktoś wpisuje toString ot tak, dla jaj, i się cała strona rozsypie na przykład).

Pytanie też co to znaczy "tablica asocjacyjna" i jakie kryteria powinien spełniać dany artefakt programistyczny, żeby za taką być uznanym.

1

@LukeJL

Raczej new Map() jak już

Nie wiem czy jest jakaś różnica (I tak i tak działa w każdym razie).

Może rozwinę myśl, bo zostawiłem to bez uzasadnienia.
Ogólnie w Twoim przykładzi nie ma to znaczenia tak jak piszesz, bo obie wersje zadziałają tu tak samo (przy tworzeniu obiektu z konstruktorem bezargumentowym mozna pominąć nawias). Nie jest to natomiast dokładnie to samo, inne jest pierwszeństwo tych dwóch zapisów.

W przypadku new SomeClass() zapis ten jest traktowany równorzędnie z operatorem ., co umożliwia ładne skrócenie zapisu bez straty czytelności:

const kartaKlienta = new Map()
  .set('Kowalski', 1)
  .set('Nowak', 3)
  .set('Kronung', 4)

W przypadku zapisu new SomeClass ma on mniejszy priorytet od operatora ., więc taki zapis:

const kartaKlienta = new Map
  .set('Kowalski', 1)
  .set('Nowak', 3)
  .set('Kronung', 4)

rzuci nam błedem Uncaught TypeError: Map.set is not a constructor.

Można co prawda używać tych zapisów naprzemiennie w zależności od potrzeb, ale cierpi na tym jednolitość kodu, dlatego warto wybrać jeden, ten wygodniejszy (stąd większość linterów krzyczy jak pominiemy nawiasy).

0

O, dzięki, nie zwróciłem uwagi na to (nie przyszło mi to do głowy). I nie wiedziałem, że set da się chainować :)

0

Dalej nwm jak to zrobić, próbowałem na wszystkie wasze sposoby, ale nie działa ;(

1

No przecież dostałeś rozwiązanie prawie na tacy, coś takiego nie działa?:

var kartaKlienta = {
  Kowalski: 1,
  Nowak: 3,
  Kronung: 4,
}

console.log(kartaKlienta[prompt()])
0
Eryk Partyka (Piesw4) napisał(a):

Zadanie:
Załóż kartę Klienta w postaci tablicy asocjacyjnej - zapisuj w niej numery pokojów zajmowanych przez konkretnych gości. Oto nazwiska gości i ich pokoje: Kowalski - 1, Nowak - 3, Kronung - 4. Następnie pobierz dane wejściowe przez prompt() (w polu pod kodem wpisz istniejące nazwisko) i wyświetl na ekranie numer pokoju należący do wybranego gościa. Nie musisz w tej chwili obsługiwać sytuacji, że taki Klient nie istnieje.

Nie skończyłem jeszcze kodu, ale tyle udało mi się napisać:

var karta_klienta = prompt()
var karta_klienta = [
Kowalski = 1,
Nowak = 3,
Kronung = 4,
];
console.log();


dla strony apki.org prawidłowa opowiedz to:

var settings_assoc_arr = [];
settings_assoc_arr['Kowalski'] = 1;
settings_assoc_arr['Nowak'] = 3;
settings_assoc_arr['Kronung'] = 4;
var room = prompt();
console.log(settings_assoc_arr[room]);

1 użytkowników online, w tym zalogowanych: 0, gości: 1