2015-10-28 15 views
6

C'è una domanda here che è simile ma è specifica di "quando le chiavi sono sconosciute in fase di esecuzione".Comprendere mappe e oggetti Documentazione MDN

Il MDN docs for Map Stato:

utilizzare le mappe di più di oggetti quando i tasti sono noti fino a tempo di esecuzione, e quando tutti i tasti sono dello stesso tipo e tutti i valori sono dello stesso tipo.

Utilizzare gli oggetti quando è presente una logica che opera su singoli elementi.

Ho compreso il consiglio sull'utilizzo delle mappe "quando le chiavi sono sconosciute fino al runtime".

Sono confuso dalla riga "quando tutte le chiavi sono dello stesso tipo e tutti i valori sono dello stesso tipo". Cosa stanno cercando di suggerire lì? Voglio dire, se tutte le mie chiavi non sono dello stesso tipo, non sono obbligato a usare Map in ogni caso dato che supporta chiavi di diverso tipo? Inoltre, perché i tipi di valori dovrebbero determinare se utilizzo una mappa o un oggetto?

Inoltre, non capisco "Usa gli oggetti quando c'è una logica che funziona sui singoli elementi". Qualcuno potrebbe darmi un esempio di cosa significano?

+1

Le raccolte di dati sono generalmente omogenee. Ad esempio, non aggiungere utenti e libri alla stessa mappa. –

+1

Penso che l'ultimo paragrafo del mio post risponda bene alla tua domanda. Vuoi che mi sviluppi? – Bergi

risposta

5

Le raccolte sono in genere omogenee. Hai una mappatura da stringhe a numeri, da id a oggetti, da nomi utente a istanze User. Tutte le chiavi hanno lo stesso tipo e tutti i valori hanno lo stesso tipo. È possibile selezionare uno di loro per un'attività.

Se hai diversi tipi, probabilmente significava un "superclasse" comune dei quali (in condizioni di estrema, si può voler ObjectObject). Se non l'hai fatto, è un odore di codice e probabilmente un errore. Soprattutto quando hai chiavi di diverso tipo.

Al contrario, gli oggetti devono essere utilizzati come records: una combinazione di campi , di dimensioni fisse. I membri sono identificati dagli identificatori , ognuno di essi può avere un tipo diverso. Si tratta di proprietà in JavaScript, codificate da stringhe o simboli. Ti riferisci a loro individualmente e li usi per scopi distinti.


Vediamo alcuni esempi.

year → 2015 
month → 9 
day → 28 

Sì, tutte le chiavi sono stringhe e tutti i valori sono numeri. Ma sicuramente non ci aspettiamo di averne di più o di meno. Usiamo un record:

var date = { 
    year: 2015, 
    month: 9, 
    day: 28 
} 
format → "MM/DD/YYY" 
monthnames → ["January", "February", …] 

Chiaramente, diversi tipi di valore. E li useremo individualmente.Quindi, di nuovo, un oggetto:

var locale_en = { 
    format: "MM/DD/YYY", 
    monthnames: ["January", "February", …] 
}; 
en → locale_en 
de → locale_de 
fr → locale_fr 
… 

Questo è chiaramente un altro. Si noti l'ellissi? Ci potrebbe essere di più. E tutte le chiavi sono codici lingua e tutti i valori sono locali. Quando li utilizziamo, useremo solo uno dei tanti. Questa è una collezione:

var locales = new Map([ 
    ["en", locale_en], 
    ["de", locale_de], 
    … 
]); 
+0

Questo e il commento di @ FelixKing sopra stanno aiutando. Quindi, se ho capito bene, mdn sta dicendo "se le chiavi sono dello stesso tipo, e i valori sono dello stesso tipo, e le coppie chiave-valore rappresentano la stessa 'cosa'", allora dovresti usare 'Mappa' . – user5325596

+0

Potresti espandere "Se hai diversi tipi, probabilmente lo intendi una" superclasse "comune (in estrema cosa, potresti volere Object-> Object). Se non lo facessi, è un odore di codice, e probabilmente un errore, specialmente quando si hanno chiavi di diverso tipo. "? Hai un esempio, non importa quanto sia inventato? I tuoi esempi finora sono molto utili. – user5325596

+0

@ user5325596: MDN sta dicendo "* Quando si desidera una raccolta (con aggiunta dinamica, rimozione, ricerca e tutto il resto), utilizzare' Mappa' * ". I tipi di chiavi e valore sono solo suggerimenti. – Bergi

Problemi correlati