Kurzusok
/
jq
jq
/
Feladatok
/
Pontszámtábla
Pontszámtábla

Pontszámtábla

Tanulófeladat

Bevezetés

Objektumok

A JSON-objektum (hogy más nyelvek terminológiáját használjuk) lényegében egy „hash”, „map” vagy „szótár”.

A JSON így definiálja az objektumot:

Az objektum név/érték párok rendezetlen halmaza. Az objektum { nyitó kapcsos zárójellel kezdődik és } záró kapcsos zárójellel végződik. Minden nevet : kettőspont követ, a név/érték párokat pedig , vessző választja el.

A név csak string lehet. A név másik elnevezése a kulcs.

Az érték bármilyen JSON-típusú lehet. Egy objektumon belül a különböző értékek eltérő típusúak lehetnek, mint ebben a példában.

{
  "name": "Jane",
  "age": 42,
  "pets": ["cat", "fish"],
  "address": {"street": "123 Main St", "city": "Springfield"}
}

Figyelj rá, hogy az utolsó kulcs-érték pár után nem lehet vessző.

Objektumok létrehozása

A név/érték párok összegyűjtéséhez kapcsos zárójelet használj. Bár a neveknek stringnek kell lenniük, nem kell őket idézőjelbe tenni, ha azonosítószerűek (alfanumerikus karakterekből és alulvonásból állnak, és nem számjeggyel kezdődnek).

{name: "Jane", age: 42}

Lehet olyan kulcsokat is használni, amelyek nem azonosítószerűek. Csak tedd őket idézőjelbe.

{"first name": "Jane", "last name": "Lopez", age: 42}

Ha a név egy kifejezés eredménye, akkor a kifejezést zárójelbe kell tenni.

$ echo "Jane" | jq -Rc '{.: 42}'
# verbose error message ...

$ echo "Jane" | jq -Rc '{(.): 42}'
{"Jane":42}

Indexelés

Az értékeket pontjelöléssel lehet kiolvasni egy objektumból.

{name: "Jane", age: 42} | .age    # => 42

Ha a kulcsra nem tudsz azonosítóként hivatkozni, használj szögletes zárójeles jelölést.

"name" as $key | {name: "Jane", age: 42} | .$key    # => error
"name" as $key | {name: "Jane", age: 42} | .[$key]  # => "Jane"

Kulcs-érték párok hozzáadása vagy módosítása

Ha új kulcs-érték párt szeretnél hozzáadni egy objektumhoz, vagy frissíteni szeretnéd egy meglévő kulcs értékét, használd a = értékadó operátort úgy, hogy a bal oldalon egy indexkifejezés áll.

{name: "Jane", age: 42} | .sport = "tennis" | .age = 21
# => {
#      "name": "Jane",
#      "age": 21,
#      "sport": "tennis"
#    }

A + operátor összevonja az objektumokat.

{Richard: 54} + {Jane: 42}
# => {
#      "Richard": 54,
#      "Jane": 42
#    }

Kulcs eltávolítása

Egy kulcs eltávolításához használd a del függvényt. Az visszaadja a frissített objektumot.

{name: "Jane", age: 42} | del(.age)   # => {"name": "Jane"}

A del paramétere egy indexkifejezés (pont- vagy szögletes zárójeles jelöléssel), amely az objektum egy kulcsára oldódik fel. A jq ezt útvonalkifejezésnek nevezi. Nem elég pusztán egy stringet megadni.

{name: "Jane", age: 42} | del(name)        # error: name/0 is not defined
{name: "Jane", age: 42} | del("name")      # error: Invalid path expression with result "name"
{name: "Jane", age: 42} | del(.name)       # OK
{name: "Jane", age: 42} | del(.["name"])   # OK

Tagság

  • Annak ellenőrzésére, hogy az objektum rendelkezik-e egy kulccsal, használd a has függvényt.

    {name: "Jane", age: 42} as $example
    |
      ($example | has("name")),    # => true
      ($example | has("sport"))    # => false
    
  • Azt, hogy egy kulcs szerepel-e egy objektumban, az in operátorral ellenőrizheted.

    {name: "Jane", age: 42} as $example
    |
      ("name"  | in($example)),    # => true
      ("sport" | in($example))     # => false
    

Az összes kulcs listázása

Az összes kulcs listázásához használd a keys függvényt.

{name: "Jane", age: 42} | keys   # => ["age", "name"]

Vegyük észre, hogy a keys rendezi a kulcsokat. Ha az eredeti sorrendben szeretnéd megkapni a kulcsokat, használd a keys_unsorted függvényt.

Nincs arra megfelelő függvény, hogy az összes értéket listázd. A .[] szűrő azonban folyamként adja ki az objektum értékeit, és ez a folyam a [...] tömbkonstruktorral fogható meg.

[{first: "Jane", last: "Lopez", status: "awesome!"} | .[]]
# => ["Jane", "Lopez", "awesome!"]

Iterálás

  • A map_values(filter) függvény a szűrőt az objektum minden egyes értékére alkalmazza.

    {first: "Jane", last: "Lopez", status: "awesome!"}
    | map_values(ascii_upcase)
    # => {"first": "JANE", "last": "LOPEZ", "status": "AWESOME!"}
    
  • Ahhoz, hogy egy objektumon iteráljunk, először kulcs-érték objektumok tömbjévé kell alakítanunk. Ezt a to_entries függvény végzi el.

    {name: "Jane", age: 42} | to_entries'
    # => [
    #      {
    #        "key": "name",
    #        "value": "Jane"
    #      },
    #      {
    #        "key": "age",
    #        "value": 42
    #      }
    #    ]
    

    Ezen a ponton már használhatjuk a tömbiterációs függvényeket, például a map-et.

  • A from_entries függvény ennek a fordítottja: kulcs-érték objektumok tömbjét alakítja objektummá.

    [
      {"key":"name", "value":"Jane"},
      {"key":"age", "value":42}
    ] | from_entries                  # =>{"name": "Jane", "age": 42}
    
  • Ha egy szűrőt az objektum minden kulcs-érték párjára alkalmazni szeretnél, használd a with_entries(filter) függvényt.

    Például ha adott egy objektum, amely nevet képez le életkorra, a kulcsok és az értékek a következőképpen cserélhetők fel.

    {"Jane": 42, "Richard": 54}
    | with_entries({key: (.value | tostring), value: .key})
    

    az alábbi kimenetet eredményezi:

    {
      "42": "Jane",
      "54": "Richard"
    }
    

    A with_entries(filter) ugyanaz, mint

    to_entries | map(filter) | from_entries
    

Utasítások

Ebben a feladatban egy módot valósítasz meg arra, hogy nyomon kövesd a helyi játéktermed legnépszerűbb játékának csúcspontszámait.

Hat függvényt kell megvalósítanod, amelyek többnyire egy csúcspontszámokat tároló objektum kezeléséhez kapcsolódnak.

1. Hozz létre egy új csúcspontszám-táblát

Írj egy create_score_board függvényt, amely létrehoz egy objektumot, ami csúcspontszám-táblaként szolgál. Az objektum kulcsai a játékosok nevei lesznek, az értékek pedig a pontszámaik. A tesztelés miatt eleve szeretnél egy bejegyzést is szerepeltetni az objektumban. Ez a kezdeti bejegyzés "The Best Ever" játékosnévből és 1000000 pontszámból álljon.

create_score_board
# returns an object with one initial entry

2. Adj játékosokat a csúcspontszám-táblához

Ha játékost szeretnél hozzáadni a csúcspontszám-táblához, valósítsd meg az add_player függvényt. Bemenetként egy csúcspontszám-táblát kap, és két paraméterre van szüksége: a játékos nevére és a játékos pontszámára. A függvény az új játékossal kiegészített csúcspontszám-tábla objektumot adja vissza.

{"José Valim", 486373}
| add_player("Dave Thomas"; 0)
# => {"Dave Thomas": 0, "José Valim": 486373} -- in some order

Ha a játékos már szerepel a táblán, a táblát változatlanul add vissza.

3. Távolíts el játékosokat a csúcspontszám-tábláról

Ha a játékosok megszegik a játékterem szabályait, kézzel távolítják el őket a csúcspontszám-tábláról. Valósítsd meg a remove_player függvényt, amely bemenetként egy táblát és egy paramétert kap: az eltávolítandó játékos nevét. A függvény eltávolítja az adott játékos bejegyzését a tábláról, és az új táblát adja vissza. Ha a játékos eleve nem szerepelt a táblán, a táblával nem történik semmi; változatlanul kell visszaadni.

{"Dave Thomas": 0} | remove_player("Dave Thomas")
# => {}

{"Dave Thomas": 0} | remove_player("Rose Fanaras")
# => {"Dave Thomas": 0}

4. Növeld egy játékos pontszámát

Ha egy játékos újabb játékot fejez be a játékteremben, bizonyos mennyiségű pont hozzáadódik a táblán szereplő korábbi pontszámához. Valósítsd meg az update_score függvényt, amely bemenetként egy csúcspontszám-táblát kap, és két paraméterre van szüksége: a játékos nevére és a hozzáadandó pontszámra. A függvény a frissítés elvégzése utáni csúcspontszám-táblát adja vissza.

{"Freyja Ćirić": 12771000} | update_score("Freyja Ćirić"; 73)
# => {"Freyja Ćirić": 12771073}

Ha a játékos még nem szerepelt a táblán, e függvény adja hozzá.

5. Alkalmazd a hétfői bónuszpontokat

A játékterem hétfőnként külön csúcspontszám-táblát vezet. A nap végén a táblán szereplő minden játékos 100 további pontot kap.

Valósítsd meg az apply_monday_bonus függvényt. A függvény minden, a táblán szereplő játékoshoz hozzáadja a bónuszpontokat.

{
  "Dave Thomas": 44,
  "Freyja Ćirić": 539,
  "José Valim": 265
}
| apply_monday_bonus
# => {"Dave Thomas": 144, "Freyja Ćirić": 639, "José Valim": 365}

6. Határozd meg a teljes pontszámot

A különböző játéktermek versengenek egymással, hogy eldőljön, kinek vannak a legjobb játékosai. A legnagyobb összpontszámot elérő játékterem nyeri el a megtiszteltetést.

Írj egy total_score függvényt. Bemenetként egy csúcspontszám-táblát kap, és az összes játékos pontszámának összegét adja vissza.

{
  "Dave Thomas": 44,
  "Freyja Ćirić": 539,
  "José Valim": 265
}
| total_score
# => 848
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
jq Exercism

Készen állsz elkezdeni a(z) Pontszámtábla feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) jq nyelvet 12 fogalom75 feladat segítségével, valódi emberi mentorálással, mindez ingyen.