Obiekt Hash jest odpowiednikiem tablicy asocjacyjnej, poznaliśmy go już przy okazji omawiania podstaw MooTools 1.2 wraz z metodami: getClean, getLength, forEach (each) oraz funkcją $H.

Teraz skupimy się na pozostałych metodach tego obiektu.

Hash - prawie jak tablica

Obiekt Hash to jak pisałem odpowiednik tablicy asocjacyjnej, a co za tym idzie posiada też metody podobne do metod stosowanych w obiekcie Array. Chodzi tu o metody: map, filter, every, some oraz indexOf (alias tej metody to keyOf). Jedyna różnica polega na istocie różnicy pomiędzy tablicą asocjacyjną, a zwykłą tablicą bazującą na obiekcie Array - w obiekcie Hash indeks elementu to nazwa klucza, a w zwykłej tablicy jest to liczba całkowita. Trzeba ten fakt uwzględnić podczas korzystania z wartości z indeksu w tych funkcjach, natomiast sama idea działania tych metod nie uległa zmiana, dlatego odsyłam do ich opisu na Mozilla Developer Center, a w tym wpisie skupimy się raczej na metodach, których normalnie w JavaScript nie spotkamy.

Jeżeli chodzi o metody jakie znamy z obiektu Array (ale nie są to metody natywne) to w obiekcie Hash występują jeszcze : extend, combine, erase, include oraz empty.

Zapewne pamiętacie różnicę pomiędzy extend i combine, dla przypomnienia - metoda combine nie akceptuje elementów o tych samych wartościach, w wypadku obiektu Hash ograniczenie to odnosi się do klucza, a nie wartości z nim powiązanej:

var test = $H({
    "pierwszy" : 1,
    "drugi" : "Druga wartosc"
});
 
test.extend({
    "pierwszy" : "Pierwsza wartosc",   
    "trzeci" : "Trzecia wartosc"
});

W wyniku działania powyższego kodu otrzymamy obiekt Hash postaci:

{
    "pierwszy" : "Pierwsza wartosc",
    "drugi" : "Druga wartosc",
    "trzeci" : "Trzecia wartosc"
}

Jak widzimy doszło do nadpisania powtarzającej się wartości (bo klucze nie mogą się powtarzać).

Natomiast w wypadku wykonania poniższego kodu na pierwotnym obiekcie test:

test.combine({
    "pierwszy" : "Pierwsza wartosc",   
    "trzeci" : "Trzecia wartosc"
});

Otrzymamy:

{
    "pierwszy" : 1,
    "drugi" : "Druga wartosc",
    "trzeci" : "Trzecia wartosc"
}

Co świadczy o braku powielenia i nadpisania elementów o tym samym kluczu.

Jeżeli chcemy wyczyścić jakiś obiekt przed umieszczeniem w nich nowych danych wystarczy zapisać:

obiektTypuHash.empty();

Użycie metody empty jest przydatne wtedy gdy potrzebujemy w obiekcie skasować stare dane i umieścić inne.

Jeżeli chodzi o metody include i erase to zostały one oczywiście dostosowane do budowy tablic asocjacyjnych:

obiektTypuHash.include(klucz, wartosc);
 
obiektTypuHash.erase(klucz);

Należy oczywiście pamiętać, że metoda include umieszcza daną parę klucz - wartość w obiekcie tylko i wyłącznie wtedy gdy klucz nie występuje w danej tablicy asocjacyjnej. Działanie metody erase polega oczywiście na usunięciu danej pary klucz - wartość z danego obiektu Hash.

Dodawanie i pobieranie wartości

Metody set i get mają nazwy dobrze mówiące o ich funkcjonalności - metoda set jest podobna składniowo do metody include z tą różnicą, że w wypadku gdy dany klucz się powtarza następuje nadpisanie wartości (tak jak w wypadku metody extend), a gdy dany klucz nie istnieje następuje dodanie nowej pary klucz - wartość (jak w wypadku metody include):

var test = $H({
    "pierwszy" : 1,
    "drugi" : "Druga wartosc"
});
 
test.set("trzeci", "Trzecia wartosc");
test.set("pierwszy", "Pierwsza wartość");

Po wykonaniu powyższego kodu hash test będzie miał następującą budowę:

{
    "pierwszy" : "Pierwsza wartosc",
    "drugi" : "Druga wartosc",
    "trzeci" : "Trzecia wartosc"
}

Wykorzystaliśmy jednocześnie nadpisywanie i dodawanie par klucz - wartość.

Aby pobrać wartość według klucza wystarczy zapis:

obiektTypuHash.get(klucz);

Przy czym należy pamiętać o obiektowej naturze Hash, a co za tym idzie o możliwości odwoływania się w poniższy sposób:

obiektTypuHash.klucz;
obiektTypuHash[klucz];

Jest czy nie ma ?

Możliwość sprawdzenia czy dana tablica asocjacyjna zawiera dany klucz bądź wartość jest niezwykle przydatna - MooTools oferuje nam do wykonania tego zadania dwie metody: has oraz hasValue (alias tej metody to contains).

Użycie obu tych metod jest banalne i ogranicza się do poniższych zapisów:

obiektTypuHash.has(klucz);
obiektTypuHash.hasValue(wartosc);

W obu wypadkach możemy otrzymać wartość logiczną true lub false w zależności od tego czy dany klucz lub wartość występuje w obiekcie typu Hash czy też nie.

Klucze i wartości

Języki skryptowe takie jak PHP czy Perl, które natywnie obsługują tablice asocjacyjne mają zaimplementowane od razu funkcje, które zwracają klucze i przypisane do nich wartości. W wypadku obiektu Hash także nie zabrakło stosownych metod. Są nimi getKeys i getValues, które zwracają odpowiednio - tablicę kluczy oraz tablicę wartości.

Obie metody nie pobierają żadnych dodatkowych parametrów, zatem ich składnia jest podobna do składni metod takich jak chociażby metoda clean:

obiektTypuHash.getKeys();
obiektTypuHash.getValues();

Metody te przydają się głównie w różnych operacjach konwersji typu zamiana obiektu Hash na obiekt Array itp. Są też przydatne przy szybkiej walidacji poprawności danych w obiekcie podczas pisania kodu.

Pomoc przy przesyłaniu danych

Jeżeli potrzebujemy przesłać dane metodą POST czy też metodą GET to niewątpliwie przydatną okaże się metoda toQueryString, która pozwala na szybką zamianę obiektu typu Hash na ciąg danych przesyłanych wspomnianymi metodami:

obiektTypuHash = $H({
    "param1" : "test",
    "param2" : 10,
    "param3" : "150"
});
 
obiektTypuHash.toQueryString();

Powyższy kod zwróci następujący ciąg znaków:

"param1=test&param2=10&param3=150"

Podsumowanie

Poznaliśmy obiekt Hash, który posiada pewne podobieństwa w stosunku do obiektu Array i jest wykorzystywany w różnych częściach frameworka MooTools ze względu na większą funkcjonalność od zwykłego obiektu natywnego Object (chociażby Browser czy Event.keys są obiektami typu Hash).

W następnych kilku częściach kursu skupimy się na tym co oferuje nam MooTools 1.2 w zakresie programowania obiektowego.

Komentarze do wpisu "MooTools 1.2 - obiekt Hash":

1. Piter2k1 napisał(a):
01 września 2008, 16:36:57

Mam pytanie. Czy istnieje funkcja odwrotna do toQueryString ?

2. Dziudek napisał(a):
01 września 2008, 16:47:33

Niestety aktualnie w MooTools 1.2 nie ma takiej funkcji (a właściwie metody), ale można w dość nieskomplikowany sposób przygotować takową – nazwijmy ją toHash:

=========================

String.implement({ toHash: function(){ var hash = new Hash(); var f = this.split(’&’); var i = 0; while(f[i]){ var t = f[i].split(’=’); hash.include(t0, t1); i++; } return hash; }
});

=========================

Dodaj komentarz:

Textile Lite włączony ( szczegółowy opis znaczników ):
*strong* | # lista numerowana | * lista wypunktowana | _em_ | __italic__ | "link":http:// | bq. cytat.