Kuidas luua JavaScriptis kahesuunalist kaarti
Kahesuunaline kaart on arvutiteaduse mudel, kus võtme ja väärtuse paaridel on võtmete ja väärtuste vahel bijektiivne 1-1 suhe. See võimaldab meil mitte ainult teha päringuid võtme järgi ja saada väärtust, vaid ka teha päringuid väärtuse järgi ja saada võti. Vaatame, kuidas rakendada JavaScriptis kahesuunalist kaarti ja muudame selle hiljem TypeScriptis turvaliseks
Arvutiteadus ja matemaatika taga
Haarame kahesuunalise kaardi põhidefinitsiooni:
Arvutiteaduses on kahesuunaline kaart assotsiatiivne andmestruktuur, milles võtme-väärtuste paarid moodustavad üks-ühele vastavuse. Seega on binaarsuhe funktsionaalne igas suunas: iga väärtuse saab vastendada ka kordumatu võtmega.
Krediit: kahesuunaline kaart
Arvutiteaduse kahesuunalise kaardi juured on matemaatilises funktsioonis, mida nimetatakse bijektsiooniks. Seos paari komponentide ja selle iga komponendi vahel erinevates komplektides on bijektiivne funktsioon, mida nimetatakse ka inverteeritavaks funktsiooniks, mis on funktsioon, mis töötab mõlemal viisil, sidudes täpselt ühe elemendi ühest hulgast täpselt ühe elemendiga. teine komplekt:
Krediit: Bijection
Seda silmas pidades saame teada, et ülaltoodud komplektide bijektiivne funktsioon annab midagi sellist:
f (1) = D
f (C) = 3
Teine asi, mis tuleneb bijektiivsest funktsioonist, on see, et komplektid on täpselt sama pikkusega, vastasel juhul bijekteerimine ebaõnnestub.
Kahesuunalise kaardi lähtestamine
Modelleerime selle JavaScripti klassiga, mis lähtestatakse võtme-väärtuste paaride objektiga:
const bimap = new BidirectionalMap({
a: 'A',
b: 'B',
c: 'C',
})
Sisemiselt loome kaks loendit. Üks loend salvestab paaride loendi, mida me nimetame edasisuunavaks kaardiks, kus võtmekaardid väärtusele ja on koopia objektist, mida kasutasime kahesuunalise kaardi lähtestamiseks. Teist loendit nimetatakse pöördkaardiks ja see salvestab kahesuunalise kaardi lähtestamiseks kasutatud objekti versiooni, kus võtme ja väärtuse paarid on ümber pööratud ja "väärtus" vastendatakse nüüd "võtmega":
Pange tähele, et kahesuunalise kaardi lähtestava objekti olemuse tõttu ei saa te võtme jaoks numbrit kasutada, kuid saate seda siiski kasutada väärtusena ja saate hiljem selle järgi päringuid teha:
const bimap = new BidirectionalMap({
a: 42,
b: 'B',
c: 'C',
})
Jõulisema, kuid ka keerukama versiooni saab kirjutada JavaScripti kaardi andmetüübiga ja lubada võtmeid, mis on numbrid, funktsioonid või isegi NaN.
Hankige element kahesuunaliselt kaardilt
Seni on meil andmestruktuur, mis majutab kahte objekti, millest üks on võtmeväärtuste poolest teise peegel. Nüüd vajame meetodit, et sellest midagi välja saada. Rakendame get()
funktsiooni:
get( key) {
return this.fwdMap[key] || this.revMap[key]
}
See on väga lihtne: kui see on pärikaardil olemas, tagastame selle, vastasel juhul tagastame tagurpidi kaardil. Kui seda pole, undefined
tagastatakse.
Nüüd saame mõned elemendid, näiteks:
console.log( bimap.get('a')) console.log( bimap.get('A'))
Lisage kahesuunalisele kaardile element
Meie kaardil ei ole praegu võimalust rohkem elemente lisada, seega lisame funktsiooni uute elementide lisamiseks kaardile:
add( pair) {
this.fwdMap[pair[0]] = pair[1]
this.revMap[pair[1]] = pair[0]
}
See võtab vastu kahest elemendist koosneva massiivi, mille tippime hiljem TypeScriptiga korteežina ja määrab need võtmetena – mõlemas suunas vastavatele objektidele väärtused.
Ja nüüd saame paari lisada ja selle uue paari kohta päringuid teha
bimap.add(['d', 'D'])
console.log( bimap.get('D'))
Tüübikindel kahesuunaline kaart TypeScriptis
Asjade paremaks muutmiseks ja tippimise turvaliseks muutmiseks saame selle TypeScriptis ümber kirjutada ja lisada tippimismõisteid, nagu kaardi lähtestamisel üldine objekt ja uue elemendi lisamisel korteež .
See tippimine muudab meie kaardi nüüd täiesti turvaliseks ja tagab, et sel juhul kasutame alati nii võtmete kui ka väärtuste jaoks stringe.