ecmascript 6 - Typescript convertiți un array într-un array asociativ
Am un șir pe care vreau să îl transform într-un șir asociativ și am nevoie de ajutor cu sintaxa. Aș dori să fac ca șirul asociativ să fie doar pentru citire.
Sunt începător în TypeScript și îmi cer scuze dacă aceasta este o întrebare foarte simplă.
Dat fiind un șir de tablouri asociative:
interface Greeting {
name: String,
punctuation?: String,
}
const GreetingArray: ReadonlyArray<Greeting> = [
{name: "noob", punctuation: "!"},
{name: "sam", punctuation: "."}
]
Am bâjbâit până am ajuns să folosesc new Map<> și să fac forEach peste elemente, dar nu sunt sigur cum să fac asta compatibil cu o hartă doar pentru citire sau cu un array asociativ general doar pentru citire.
Ceea ce mi-aș dori este să pot transforma array-ul meu de array-uri asociative într-un obiect care să suporte comportament de tip dict/hashmap pentru căutări, folosind .name ca și cheie și întregul array asociativ ca obiect ({"noob": {name: "noob", punctuation: "!"}, "sam": {name: "sam", punctuation: "."}}).
editare: am eliminat încercarea eșuată care distrăgea, conform sugestiei :)
edit2: eliminând și mai mult text inutil din întrebarea mea 😅
Răspuns #1
Tipul pe care îl cauți este ceva de genul
interface GreetingDict {
readonly [k: string]: Greeting
}
care are o semnătură de index string, ceea ce înseamnă că ar putea avea orice număr de chei cu valoare string, fiecare dintre acestea ar trebui să aibă asociată o proprietate cu valoare Greeting. Și este o semnătură de index readonly, ceea ce înseamnă că compilatorul va descuraja oamenii să facă orice scrieri în ea. (Rețineți că ea doar descurajează astfel de scrieri și nu garanatează că scrierile nu pot avea loc; este doar un construct la timpul de compilare, iar TypeScript consideră proprietățile readonly ca fiind atribuibile reciproc către proprietăți non-readonly, așa că este suficient de ușor să ocoliți acest lucru scriind în același obiect folosind o referință al cărei tip nu este readonly.)
Dat fiind un tablou de Greeting-uri precum
const greetingArray: ReadonlyArray<Greeting> = [
{ name: "noob", punctuation: "!" },
{ name: "sam", punctuation: "." }
]
poți să îl convertești într-un GreetingDict prin map-area lui într-un array de perechi cheie-valoare și apoi folosind metoda Object.fromEntries() pentru a-l transforma într-un singur obiect.
const myReadOnly: GreetingDict =
Object.fromEntries(greetingArray.map(g => [g.name, g]));
Poți verifica că acest lucru funcționează conform așteptărilor:
console.log(myReadOnly)
/* {
"noob": {
"name": "noob",
"punctuation": "!"
},
"sam": {
"name": "sam",
"punctuation": "."
}
} */
Link de teren de joacă către cod
