CH07-L01 · praktické použitie

Reťazenie transformácií

Vytvoríte pomocné mapy, vyfiltrujete ich a výsledok prevediete na požadovaný tvar.

Všeobecný CELSpustiteľné tuZdokumentované
Čo sa naučím?

Viete čítať reťazec map() → filter() → map() ako postupné transformácie jedného zoznamu.

Kde si to vyskúšam?

Priamo nižšie v skúšobnom prostredí prehliadača.

Čo mám urobiť?

Spustite oba režimy, porovnajte pôvod ich hodnôt a potom dokončite úlohu.

Vyskúšajte CEL · pilot v prehliadači

Vyskúšajte oba spôsoby zadania hodnôt

Lokálne hodnoty môžete definovať v jednom výraze CEL alebo môžete premenné zadať ako vstup JSON. Všetko sa vykonáva vo vašom prehliadači.

Pilotná podmnožina CEL
Jeden samostatný výraz CELFunkcia cel.bind() priradí hodnote lokálny názov a vráti výsledok posledného výrazu.

cel.bind()cel.bind() je voliteľné oficiálne rozšírenie. Nie je súčasťou jadra jazyka CEL a hostiteľská aplikácia ho nemusí podporovať.

Tip: výraz spustíte aj klávesmi Ctrl/⌘ + Enter.
Výsledok

Aktívny príklad vyhodnotíte tlačidlom Spustiť CEL.

Rozsah pilotu: literály, explicitné konverzie, lokálne premenné vytvorené pomocou cel.bind(), premenné z JSON, zoznamy, mapy, prítomnosť, kolekčné makrá, základné kontroly reťazcov, časové hodnoty, aritmetika, porovnávanie, logika a podmienený operátor.

Čo budete robiť

Jeden zoznam prevediete cez tri jasné fázy: výpočet pomocných údajov, výber vhodných položiek a zostavenie konečného výsledku. Príklad spustite najprv v režime Iba CEL a potom v režime CEL + JSON.

Ako to funguje

Každé volanie v reťazci pracuje s výsledkom predchádzajúceho volania. Prvé map() vytvorí mapu s kódom a vypočítaným súčtom. filter() ponechá iba objednávky od 100. Posledné map() vráti už iba ich kódy.

orders
  .map(order, {'code': order.code, 'total': order.price * order.quantity})
  .filter(row, row.total >= 100.0)
  .map(row, row.code)

Vyhodnotenie krok za krokom

  1. Objednávka A-10 dostane medzivýsledok {'code': 'A-10', 'total': 100.0}.
  2. Objednávka B-20 má súčet 54.0, preto ju filter odstráni.
  3. C-30 má súčet 120.0 a zostane vo výsledku.
  4. Posledná transformácia vráti ['A-10', 'C-30'].

Pomocná mapa je obyčajná hodnota CEL. Nemodifikuje vstupnú objednávku a existuje iba vo výsledku daného kroku.

Vaša úloha

  1. Spustite pripravený výraz.
  2. Zmeňte hranicu zo 100.0 na 110.0.
  3. Namiesto row.code vráťte posledným map() celú pomocnú mapu row.

Očakávané pozorovanie: Po zvýšení hranice zostane iba C-30. Po odstránení poslednej projekcie uvidíte aj vypočítané súčty.

Častá chyba

Premenná makra platí iba v jeho vlastnom tele. Názov order nie je dostupný v nasledujúcom filter(); tam pracujete s novou položkou pomenovanou row.

Zobraziť vysvetlenie

Výstup prvého map() je nový zoznam máp. Ďalšie makro už nečíta pôvodné objednávky, ale práve tieto mapy.

Kontrolná otázka

Aký typ zoznamu vstupuje do filter() a aký typ zoznamu vracia posledné map()?

Hlavná myšlienka

Dlhší výraz čítajte zľava doprava ako dátový tok. Každá fáza má mať jednu zrozumiteľnú úlohu.

Zdroje

  • CEL-DEV — oficiálny prehľad CEL a kolekčných makier.
  • CEL-LANG — oficiálna definícia zoznamov, máp a makier.
  • CEL-GO-BIND — oficiálna dokumentácia voliteľného rozšírenia cel.bind() použitého v samostatnej záložke.