Operacje na tablicach

Transkrypt

Operacje na tablicach
Łączenie elementów tablicy przy pomocy metody join()
Metoda join() słuzy do łączenia kolejnych elementów w jeden tekst. Opcjonalnym parametrem tej
metody jest znak, który będzie oddzialał kolejne elementy w utworzonym tekście. Jeżeli go nie
podamy będzie użyty domyślny znak przecinka:
var tablica = new Array("Marcin", "Ania", "Agnieszka")
document.write(tablica.join() + "<br />") //wypisze się "Marcin,Ania,Agnieszka"
document.write(tablica.join(" - ") + "<br />") //wypisze się "Marcin - Ania - Agnieszka"
document.write(tablica.join(" + ") + "<br />") //wypisze się "Marcin + Ania + Agnieszka"
Marcin,Ania,Agnieszka
Marcin - Ania - Agnieszka
Marcin + Ania + Agnieszka
Odwracanie kolejności elementów tablicy przy pomocy metody reverse()
Dzięki metodzie reverse() możemy odwrócić elementy naszej tablicy:
var tablica = new Array("numer 1" , "numer 2" , "numer 3" , "numer 4");
document.write('<strong>Przed:</strong> ' + tablica.join() + '<br />');
tablica.reverse()
document.write('<strong>Po:</strong> ' + tablica.join() );
Przed: numer 1,numer 2,numer 3,numer 4
Po: numer 4,numer 3,numer 2,numer 1
Sortowanie tablic za pomocą metody sort()
Metoda sort() służy do sortowania tablic metodą "bombelkową". Powiedzmy, że mamy tablicę z
niepoukładanymi wartościami, i chcemy ją posortować:
var Tablica = new Array('Marcin','Ania','Piotrek','Grześ')
Tablica.sort()
document.write( Tablica.join() ); //wypisze się "Ania,Grześ,Marcin,Piotrek"
Standardowo Javascript segreguje tablice leksykalnie (czyli tak jak w książce telefonicznej). Powoduje
to w niektórych przypadkach nieoczekiwane rezultaty - na przykład 1200 będzie mniejsze od 300 (bo
liczy się pierwsza cyfra) itp.
Aby móc posegregować naszą tablicę według własnych kryteriów, musimy skorzystać z dodatkowego
parametru, który metoda sort() może opcjonalnie przyjmować. Parametr ten jest nazwą naszej
funkcji sortującej. Pisząc taką funkcję musimy pamiętać o 3 sprawach:
Jeżeli funkcja(a, b) zwróci wartość mniejszą od 0, to wartość a będzie miała mniejszy index od b
Jeżeli funkcja(a, b) zwróci 0, to indexy wartości a i b pozostaną bez zmian
Jeżeli funkcja(a, b) zwróci wartość większą od 0, to wartość a będzie miała większy index od b
Tak więc ogólna postać funkcji sortującej wygląda tak:
function porownaj(A, B) {
if (A jest mniejsze od B) {return -1}
if (A jest większe od B) {return 1}
//jeżeli A równa się B
return 0
}
Przykładowo aby posegregować wartości liczbowe musimy utworzyć funkcję:
//tworzymy funkcję do segregacji liczb
function porownajLiczby(a, b) {
return a - b
}
var Tablica = Array(100, 10, 25, 310, 1200, 400);
document.write('Bez sortowania:');
document.write( Tablica.join() );
document.write('Tablica.sort():');
Tablica.sort()
document.write( Tablica.join() );
document.write('Tablica.sort(segregujLiczby):');
Tablica.sort(porownajLiczby)
document.write( Tablica.join() );
Działanie powyższego skryptu widać poniżej:
Bez sortowania: 100,10,25,310,1200,400
Tablica.sort(): 10,100,1200,25,310,400
Tablica.sort(segregujLiczby): 10,25,100,310,400,1200
Oczywiście możemy sami wymyślać nasze własne kryteria segregacji (na przykład by cyfry były
"mniejsze" od liter, lub też duże litery były "mniejsze" od małych liter...).
Łączenie dwóch tablic
Standardowo Javascript nie udostępnia nam metody, która łączyła by dwie tablice w jedną.
Zwyczajne dodawanie też nie przynosi oczekiwanych rezultatów, gdyż wynik zwracany jest w formie
tekstu. Dodatkowym utrudnieniem jest fakt, że poszczególne elementy w zwróconym ciągu są od
siebie oddzielone przecinkami, jednak między ostatnim elementem pierwszej tablicy, a pierwszym
drugiej przecinka nie ma.
Napiszmy funkcję, która będzie tworzyła nową tablicę z dwóch:
function dodajTablice(tab1,tab2) {
return (tab1 + ',' + tab2).split(',');
}
var tab1 = new Array('Marcin','Ania');
var tab2 = new Array('Skorpion','Rybka');
var tab3 = dodajTablice(tab1,tab2);
document.write(typeof(tab3)) //wypisze się object
document.write(tab3) //wypisze się Marcin,Ania,Skorpion,Rybka
Możemy też napisać funkcję, która będzie łączyć kilka tablic podanych w parametrze.
Poniższa funkcja nie ma zadeklarowanej liczby parametrów, tak więc możemy do niej przekazać 2, 3
a nawet więcej tablic, z których powstanie jedna.
function dodajTablice() {
var tabTemp = new Array;
for (x=0; x<arguments.length-1; x++) {
tabTemp += arguments[x]+',';
}
}
tabTemp += arguments[arguments.length-1];
return tabTemp.split(', ');
var tab1 = new Array('Marcin', 'Ania');
var tab2 = new Array('Skorpion', 'Rybka');
var tab3 = new Array('Czarny', 'Czerwony');
var tab4 = dodajTablice(tab1, tab2, tab3);
document.write(typeof(tab4)); //wypisze się object
document.write(tab4); //wypisze się Marcin, Ania, Skorpion, Rybka, Czarny, Czerwony
Mieszanie tablicy
Skoro potrafimy posortować tablicę, to nauczmy się też wykonać operację wręcz odwrotną pomieszać przypadkowo elementy tablicy. Javascript niestety nie udostępnia metody do "psucia"
tablicy, więc będziemy musieli napisać ją sobie sami:
function mieszamy(tablica) {
for (var i = 0; i < tablica.length; i++) { //wykonujemy pętlę po całej tablicy
var j = Math.floor(Math.random() * tablica.length); //losujemy wartość z
przedziału 0 - tablica.length-1
var temp = tablica[i]; //pod zmienną temp podstawiamy wartość bieżącego
indexu
tablica[i] = tablica[j]; //pod bieżący index podstawiamy wartość z indexu
wylosowanego
tablica[j] = temp; //pod wylosowany podstawiamy wartość z bieżącego
indexu
}
}
return tablica;
W parametrze tej funkcji podajemy tablicę, która ma być pomieszana. Zasada działania tej funkcji
jest podobna do zasady działania segregowania bąbelkowego (ta sama metoda zamiany indeksów).
Wyliczanie średniej wartości elementów tablicy
Znowu musimy polegać tylko na własnym talencie programistycznym ;). Zasada bardzo prosta dodaj wszystkie elementy tablicy i podziel je przez ilość tych elementów:
function srednia(tablica) {
var suma = 0;
for (i=0; i<tablica.length; i++) {
suma += tablica[i];
}
return (suma/i); //wszystko podzielone przez ilość elementów
}
Największa i najmniejsza wartość w tablicy
Jak sprawdzić która wartość w tablicy jest największa? Podstawiamy pod zmienną max pierwszy
element tablicy. Wykonujemy pętlę po pozostałych elementach tablicy. Jeżeli dany element jest
większy od zmiennej max, to pod tą zmienną podstawiamy wartość tego elementu. I tak do końca
tablicy... Tak samo czynimy w przypadku znajdowania najmniejszej wartości. Różnica polega na
sprawdzaniu, czy wartość sprawdzanego elemtnu jest mniejsza od zmiennej mins
function max(tablica) {
var maximum = tablica[0];
for (var i=1; i<arrObj.length; i++) {
maximium = (tablica[i] > maximum)? tablica[i] : maximum;
}
return (maximum);
}
function min(tablica) {
var minimum = tablica[0];
for (var i=1; i<tablica.length; i++) {
minimum = (tablica[i] < minimum)? tablica[i] : minimum;
}
return (minimum);
}
Tworzenie nowej tablicy za pomocą metody slice()
Metoda slice(od,ile) "tnie" naszą tablicę i tworzy w ten sposób nową. Pierwszy parametr od wskazuje
na index (może być ujemny - wtedy będzie liczony od końca tablicy), od którego ma "wyciąć"
elementy, a parametr ile wskazuje ile elementów ma być "wyciętych" (licząc od początku tablicy):
var Tablica = new Array('Marcin', 'Ania', 'Agnieszka');
var Tablica_2 = Tablica.slice(0,1)
document.write(Tablica_2.join()); //wypisze się "Marcin"
var Tablica_2 = Tablica.slice(0,2)
document.write(Tablica_2.join()); //wypisze się "Marcin,Ania"
var Tablica_2 = Tablica.slice(0,5)
document.write(Tablica_2.join()); //wypisze się "Marcin,Ania,Agnieszka"
var Tablica_2 = Tablica.slice(0,1)
document.write(Tablica_2.join()); //wypisze się "Marcin"
Więcej przykładów zastosowania tej metody możesz zobaczyć tutaj: slice().
Metoda ta bardzo dobrze nadaje się do usuwania pierwszych i ostatnich elementów z naszej tablicy.
Na przykład aby usunąć pierwszy element zastosujemy instrukcję:
var Tablica = new Array('Marcin', 'Ania', 'Agnieszka');
document.write( Tablica.slice(1) )
Aby usunąć ostatni element skorzystajmy z instrukcji:
document.write( Tablica.slice(0,Tablica.length-1) )
Dodawanie ostatniego elementu do tablicy za pomocą metody push()
Metoda push() wstawia nowy element (lub kilka) do tablicy na jej końcu i zwraca długość nowej
tablicy
var tablica = new Array('Marcin', 'Ania', 'Agnieszka');
var dlugosc = Tablica.push('Grzegorz','Marta');
alert(dlugosc); //wypisze się 5
alert(tablica) //wypisze się "Marcin,Ania,Agnieszka,Grzegorz,Marta"
Możemy też napisać własną funkcję mojPush, która będzie zwracała zamiast długości - tablicę z
nowym elementem:
function mojPush() {
for (var x=0; x<arguments.length; x++) {//wykonujemy pętlę po wszystkich
argumentach funkcji
this[this.length] = arguments[x];//dodajemy nowy element na końcu tablicy
}
}
Array.prototype.mojPush = mojPush; //dodajemy naszą funkcję jako metodę obiektu Array
var Tablica = new Array('Marcin', 'Ania', 'Agnieszka');
Tablica = mojPush('Grzegorz')
document.write(Tablica.join()); //wypisze się "Marcin,Ania,Agnieszka,Grzegorz"
Usuwanie ostatniego elementu z tablicy przy pomocy metody pop()
Metoda pop() usuwa ostatni element talicy, po czym go zwraca:
var Tablica = new Array('Marcin', 'Ania', 'Agnieszka');
var element = Tablica.pop();
alert(element); //wypisze się Agnieszka
alert(Tablica); //wypisze się "Marcin,Ania"
My jesteśmy oczywiście ci "lepsiejsi", więc napiszemy własną funkcję pop, która będzie usuwała kilka
elementów na raz. Dodatkowo funkcja nasza zwracać będzie tablicę zawierającą usunięte elementy:
function popN(n) {
var tab = [];
for (var x=0; x<n; x++) {
tab[tab.length] = this[tab.length];
this.pop();
}
tab.reverse();
return tab;
}
Array.prorotype.popN = popN;
var Tablica = new Array('Marcin', 'Ania', 'Agnieszka');
var elementyUsuniete = Tablica.popN(2);
alert(elementyUsuniete); //wypisze Ania,Agnieszka
alert(Tablica); //wypisze Marcin
Dodawanie pierwszego elementu do tablicy za pomocą metody unshift()
Metoda unshift() wstawia nowy element do tablicy na jej początku, po czym zwraca nową długość
tablicy
var Tablica = new Array('Marcin', 'Ania', 'Agnieszka');
var dlugosc = Tablica.unshift('Piotrek','Pawel');
alert(dlugosc); //wypisze 5
alert(Tablica); //wypisze się "Piotrek,Pawel,Marcin,Ania,Agnieszka"
Usuwanie pierwszego elementu z tablicy za pomocą metody shift()
Metoda shift() usuwa pierwszy element z tablicy i go zwraca:
var Tablica = new Array('Marcin', 'Ania', 'Agnieszka');
var element = Tablica.shift();
alert(element); //wypisze się Marcin
alert(Tablica.join()); //wypisze się "Ania,Agnieszka"
Własna funkcja shiftN() będzie miała postać:
function shiftN(n) {
var tab = [];
for (var x=0; x<n; x++) {
tab[tab.length] = this.shift();
}
return tab;
}