Č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
Maya in ['Maya', 'Leo']jetrue, po negáciifalse.Nora in ['Maya', 'Leo']jefalse, po negáciitrue.Leoje evidovaný, preto ho filter odstráni.- Projekcia vráti
['Nora'].
Tento vzor sa hodí vždy, keď chcete z jednej kolekcie odobrať hodnoty uvedené v druhej kolekcii.
Vaša úloha
- Spustite pripravený výraz.
- Odstráňte negáciu
!a porovnajte výsledok. - Pridajte meno
NoradoregisteredNames.
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átorain, negácie a makier.CEL-GO-BIND— oficiálna dokumentácia voliteľného rozšíreniacel.bind()použitého v samostatnej záložke.