Jako vývojář často potřebujete zjistit, zda zadaná položka již v kolekci existuje, nebo najít všechny položky odpovídající určitým kritériím. Metody kolekcí 4D nabízejí mnoho různých způsobů, jak vyhledat konkrétní položky.
Tento článek je součástí seriálu, který ukazuje, jak manipulovat s kolekcemi pomocí metod přidaných na 4D v16 R6. Chcete-li se dozvědět ještě více, stáhněte si naši ukázku databáze, která obsahuje 12 různých příkladů ukazujících, co všechno lze s metodami kolekcí dělat!
Příklad databáze: Správa kolekcí
JAK najít položky v kolekci?
Podívejme se nyní na různé způsoby, které 4D nabízí pro vyhledávání položek v kolekci. Nejprve začneme vytvořením kolekce následujícím způsobem:
$col:=New collection(New object("Město"; "Paříž"; "Počasí";1))
$col .push(New object("Město"; "New-York"; "Počasí";-10))
$col .push(New object("Město"; "Tokio"; "Počasí";-5))
$col .push(New object("Město"; "Miami"; "Počasí";15))
Použití metod „some“ nebo „every“
Chcete-li zjistit, zda je alespoň jedna hodnota vaší kolekce větší než 0, můžete použít příkaz some metodu:
$b:=$col.some("WeatherGreaterThan0") // true
kde WeatherGreaterThan0 je metoda projektu, která se používá jako zpětné volání takto:
$1.result:=$1.value.Weather>0
Pokud nyní chcete zjistit, zda se všechny prvky vaší kolekce shodují s vlastním testem, stačí použít příkaz every:
$b:=$col.every("WeatherGreaterThan0") // false
Všimněte si, že stejnou metodu zpětného volání lze použít i pro mnoho dalších případů jako jakousi obecnou metodu.
filtrování kolekce
Kolekci můžete filtrovat podle výsledků metody zpětného volání pomocí metody filter metodou.
Stejným způsobem jako ve výše uvedených příkladech, pokud chcete vytvořit kolekci se všemi hodnotami většími než 0 z jiné kolekce:
filter("WeatherGreaterThan0")
// [{City:Paris,Weather:1},{City:Miami,Weather:15}].
najde první prvek odpovídající kritériu
Pokud hledáte první prvek kolekce, který se shoduje se zadanou metodou projektu, stačí použít příkaz find jako metodu zpětného volání:
$o:=$col.find("WeatherGreaterThan0") // {City:Paris,Weather:1}
Stejně tak, pokud hledáte index, a ne samotný prvek, použijte funkci findIndex:
$index:=$
col .findIndex("WeatherGreaterThan0")
// $i=0 (první index kolekce)
Získání indexu hledaného prvku
Nakonec můžete použít metodu indexOf a lastIndexOf k vyhledání výrazu mezi prvky kolekce a vrácení indexu prvního/posledního nalezeného výskytu:
$col2:=New collection(1;2; "Henry"; "Albert"; "Henry";6;4; "Henry";5)
$i :=$col2.indexOf("Henry") //$i=2 index of the first occurrence
$i :=$col2.lastIndexOf("Henry") //$i=7 index of the last occurrence