CH07-L02 · praktické použitie

Filter, map a členstvo

Vylúčite už evidované hodnoty a zo zostávajúcich objektov vytvoríte jednoduchý zoznam.

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

Viete skombinovať negáciu, operátor in, filter() a map() do jedného výberového pravidla.

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ť

Spojíte operátor in, logickú negáciu, filter() a map() do jedného všeobecného vzoru. Výsledkom budú mená, ktoré ešte nie sú v druhom zozname.

Ako to funguje

users
  .filter(user, !(user.name in registeredNames))
  .map(user, user.name)

Výraz user.name in registeredNames zisťuje členstvo. Vonkajšie ! výsledok obráti, preto filter ponechá iba používateľov, ktorých meno sa v zozname nenachádza. Následné map() z objektov vyberie mená.

Vyhodnotenie krok za krokom

  1. Maya in ['Maya', 'Leo'] je true, po negácii false.
  2. Nora in ['Maya', 'Leo'] je false, po negácii true.
  3. Leo je evidovaný, preto ho filter odstráni.
  4. Projekcia vráti ['Nora'].

Tento vzor sa hodí vždy, keď chcete z jednej kolekcie odobrať hodnoty uvedené v druhej kolekcii.

Vaša úloha

  1. Spustite pripravený výraz.
  2. Odstráňte negáciu ! a porovnajte výsledok.
  3. Pridajte meno Nora do registeredNames.

Očakávané pozorovanie: Bez negácie dostanete evidované mená. Po pridaní Nory do zoznamu bude pôvodný vylučovací výsledok prázdny.

Častá chyba

Nezamieňajte si !(value in list) s !value in list. Zátvorky jasne určujú, že negujete výsledok kontroly členstva.

Zobraziť vysvetlenie

Najprv sa vyhodnotí členstvo a až potom sa logická hodnota obráti. Zátvorky zároveň robia zámer čitateľným pre ďalšieho človeka.

Kontrolná otázka

Prečo je vhodné filtrovať objekty ešte pred tým, než ich pomocou map() zmeníte na mená?

Hlavná myšlienka

Kombinácia filter() a map() oddeľuje rozhodnutie, ktoré položky zostanú, od rozhodnutia, aký tvar budú mať.

Zdroje

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