Proszę o pomoc z zadaniem o Tablicach Asocjacyjnych w JavaScript

Odpowiedz Nowy wątek
2017-08-11 23:03
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();
 
Co za kurs przerabiasz, można wiedzieć? Terminologia nie JSowa, bardziej PHPowa widzę. - Maciej Cąderek 2017-08-12 02:48

Pozostało 580 znaków

2017-08-12 00:04
0

tablica asocjacyjna w JS to po prostu obiekt.

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

Pozostało 580 znaków

2017-08-12 01:17
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.

edytowany 2x, ostatnio: LukeJL, 2017-08-12 01:20
Raczej new Map() jak już - Maciej Cąderek 2017-08-12 02:31
Nie wiem czy jest jakaś różnica (I tak i tak działa w każdym razie). - LukeJL 2017-08-12 02:51

Pozostało 580 znaków

2017-08-12 02:45
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()).

Pozostało 580 znaków

2017-08-12 03:01
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.

edytowany 4x, ostatnio: LukeJL, 2017-08-12 03:14

Pozostało 580 znaków

2017-08-12 04:06
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).

edytowany 3x, ostatnio: Maciej Cąderek, 2017-08-12 04:23

Pozostało 580 znaków

2017-08-12 13:34
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ć :)

Pozostało 580 znaków

2017-08-12 22:54
0

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

Pozostało 580 znaków

2017-08-12 23:02
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()])
Chodziło mi o to, że nie wiedziałem w jaki sposób umieścić prompt. Dziękuję za pomoc :) - Eryk Partyka (Piesw4) 2017-08-13 23:11

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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