Ìàññèâû
Àâòîð: Àðòåìüåâ Ñåðãåé Èãîðåâè÷ ICQ: 438856621 email: _spin_@bk.ru |
Êàê è áîëüøèíñòâî ÿçûêîâ ïðîãðàììèðîâàíèÿ, JavaScript ïðåäîñòàâëÿåò ñðåäñòâî äëÿ ðàáîòû ñ ôîðìàëèçîâàííûìè äàííûìè áîëüøîãî îáúåìà - ìàññèâû. Ìàññèâ - ýòî ñïèñîê ïåðåìåííûõ, ê êàæäîé èç êîòîðûõ ìîæíî ïîëó÷èòü äîñòóï ïî å¸ íîìåðó. Ìàññèâ ñîçäà¸òñÿ ñëåäóþùèì îáðàçîì:
// ñîçäàíèå ïóñòîãî ìàññèâà // çàäàíèå çíà÷åíèé ïåðâûõ äâóõ ýëåìåíòîâ var myArray = new Array() myArray[0] = 'Ìîñêâà' myArray[1] = 'Õàáàðîâñê' // ñîçäàíèå íîâîãî ìàññèâà // è ðåçåðâèðîâàíèå ìåñòà äëÿ // 100 ïåðåìåííûõ var myArray = new Array(100) // ñîçäàíèå íîâîãî ìàññèâà // è ÿâíàÿ èíèöèàëèçàöèÿ ïåðâîãî ýëåìåíòà var myArray = new Array('Ýëåìåíò'); // êîñâåííîå ñîçäàíèå ìàññèâà // èç äâóõ ýëìåíåòîâ var myArray = ['ïåðâûé ýëåìåíò', 'âòîðîé ýëåìåíò']
Âñå ìàññèâû, íåçàâèñèìî îò ñïîñîáà ñîçäàíèÿ, ïðåäñòàâëÿþò ñîáîé ýêçåìïëÿðû êëàññà (îáúåêòà) Array. Äîáàâëåíèå ýëåìåíòîâ ïðîèçâîäèòñÿ ïðîñòîé èíèöèàëèçàöèåé ñîîòâåòñòâóþùåãî ýëåìåíòà.
var myArray = new Array() myArray[0] = 'Ïèòåð'
Ìàññèâû â JavaScript íå îáÿçàòåëüíî äîëæíû áûòü "ñïëîøíûìè", ò.å. ñîäåðæàòü âñå ýëåìåíòû. Ïðè íåîáõîäèìîñòè ìîæíî ñîçäàâàòü òàê íàçûâàåìûå "ðàçðåæåííûå" ìàññèâû:
var myArray = new Array(); myArray[0] = 'Ïèòåð' // ïðîïóñòèì myArray[1] myArray[2] = 'Ãîìåëü' // ïðîïóñòèì myArray[3] myArray[4] = 'Ðÿçàíü' myArray[5] = 'Ïñêîâ' for(i = 0; i < 6; i++) alert(myArray[i])
Ýòîò êîä ñîçäà¸ò ìàññèâ è çàïîëíÿåò òîëüêî íåîáõîäèìûå ýëåìåíòû. Òåïåðü åñëè ìû ïîïðîáóåì ïîëó÷èòü çíà÷åíèå íå èíèöèàëèçèðîâàííîãî ýëåìåíòà (â ïðèìåðå ýòî ïåðâûé è òðåòèé), òî ïîëó÷èì "undefined". Èñïîëüçîâàíèå ðàçðåæåííûõ ìàññèâîâ èíîãäà î÷åíü óäîáíî, íî òðåáóåò îïûòà è âíèìàòåëüíîñòè, ïîýòîìó íà íà÷àëüíîì ýòàïå ëó÷øå îò íèõ îòêàçàòüñÿ. Êðîìå òîãî, ðàçðåæåííûå ìàññèâû íå äàþò âûãîäû ïî èñïîëüçîâàíèþ ïàìÿòè, ò.ê. ìåñòî ðåçåðâèðóåòñÿ äëÿ âñåõ ýëåìåíòîâ, â òîì ÷èñëå íå èíèöèàëèçèðîâàííûõ.
Ýëåìåíòàìè ìàññèâà ìîãóò áûòü ïåðåìåííûå ëþáîãî òèïà. Èíòåðåñíàÿ îñîáåííîñòü JavaScript - ìàññèâ ìîæåò îäíîâðåìåííî ñîäåðæàòü ýëåìåíòû ðàçëè÷íûõ òèïîâ, â òîì ÷èñëå ìàññèâû:
// // ìàññèâ ñ ýëåìåíòàìè ðàçíûõ òèïîâ // var myArrayS = new Array(); myArrayS[0] = 'ßðîñëàâëü'; myArrayS[1] = 10000; myArrayS[2] = 'ßìàë'; myArrayS[3] = 5000; for(i = 0; i < myArrayS.length; i += 2) alert('Ãîðîä: ' + myArrayS[i] + '\n' + 'Íàñåëåíèå: ' + myArrayS[i + 1] + '\n') // // ìàññèâ ñ ýëåìåíòàìè-ìàññèâàìè // var myArrayA = new Array() myArrayA[0] = new Array('ßðîñëàâëü', 10000); myArrayA[1] = new Array('Ñòàâðîïîëü', 5000); for(i = 0; i < myArrayA.length; i++) alert('Ãîðîä: ' + myArrayA[i][0] + '\n' + 'Íàñåëåíèå: ' + myArrayA[i][1] + '\n')
Êëàññ Array ñîäåðæèò åäèíñòâåííîå ñâîéñòâî - length, ïîçâîëÿþùåå óçíàòü òåêóùóþ äëèíó ìàññèâà:
var myArray = new Array(); ... // óçíàòü êîëèåê÷òâî ýëåìåíòîâ alert(myArray.length) // äîáàâèòü ýäåìåíò ïîñëåäíèì myArray[myArray.length] = 'ïîñëåäíåå çíà÷åíèå'
Îáðàòèòå âíèìàíèå, ÷òî çíà÷åíèå Array.length íà åäèíèöó áîëüøå íîìåðà ïîñëåäíåãî ýëåìåíòà ìàññèâà, ò.ê. íóìåðàöèÿ â ìàññèâå íà÷èíàåòñÿ ñ íóëÿ, à ñâîéñòâî length ïîêàçûâàåò îáùåå êîëè÷åñòâî ýëåìåíòîâ.
Êëàññ Array òàê æå ñîäåðæèò ðÿä ìåòîäîâ, ñóùåñòâåííî óïðîùàþùèõ íåêîòîðûå ðóòèííûå îïåðàöèè ñ ìàññèâàìè:
Array.join() | Ïîëó÷åíèå ñïèñêà ýëåìåíòîâ ìàññèâà â âèäå îäíîé ñòðîêè áåç ðàçäåëèòåëåé. |
Array.join(ðàçäåëèòåëü) | Ïîëó÷åíèå ñïèñêà ýëåìåíòîâ ìàññèâà â âèäå îäíîé ñòðîêè, ïðè÷åì ýëåìåíòû ìàññèâà ðàçäåëåíû ñòðîêîé "ðàçäåëèòåëü" |
Array.reverse() | Èçìåíåíèå ïîðÿäêà ñîðòèðîâêè ìàññèâà. Ýòîò ìåòîä "ïåðåâîðà÷èòâàåò" ìàññèâ: ïåðâûé ýëåìåíò ñòàíîâèòñÿ ïîñëåäíèì è íàîáîðîò. |
Array.sort() | Ñîðòèðîâêà ìàññèâà ïî àëôàâèòó. Åñëè ìàññèâ ñîäåðæèò ÷èñëîâûå äàííûå, òî ïðè ñîðòèðîâêå èñïîëüçóþòñÿ èõ ñòðîêîâûå ïðåäñòàâëåíèÿ. |
Array.sort(ôóíêöèÿ_ñîðòèðîâêè) | Ñîðòèðîâêà ìàññèâà ïî ïîëüçîâàòåëüñêîìó êðèòåðèþ, êîòîðûé çàäà¸òñÿ ñ ïîìîùüþ ñîáñòâåííîé ôóíêöèè ñîðòèðîâêè: |
Ðàññìîòðèì íåáîëüøîé ïðèìåð:
// ôóíêöèÿ ñîðòèðîâêè ìàññèâà function sortByLength(a, b) { if(a.length > b.length) return 1; else if(a.length = b.length) return 0; else return -1; } // èíèöèàëèçàöèÿ ìàññèâà var myArray = new Array() myArray[0] = 'ßðîñëàâëü' myArray[1] = 'ßìàë' myArray[2] = 'Ñòàâðîïîëü' myArray[3] = 'Îìñê' myArray[4] = 'Àíàïà' alert('èñõîäíûé ìàññèâ:\n\n' + myArray.join('\n')) // ñîðòèðóåì ïî àëôàâèòó myArray.sort(); alert('ñîðòèðîâàííûé ïî àëôàâèòó:\n\n' + myArray.join('\n')) // ñîðòèðóåì â îáðàòíîì ïîðÿäêå myArray.reverse(); alert('ïåðåâ¸ðíóòûé:\n\n' + myArray.join('\n')) // ñîðòèðóåì ïî äëèíå ñ ïîìîùüþ ñîáñòâåííîé ôóíêöèè myArray.sort(sortByLength); alert('ñîðòèðîâàííûé ïî äëèíå:\n\n' + myArray.join('\n'))
Êàê âèäèòå, ïîëüçîâàòüñÿ ìåòîäàìè ìàññèâà î÷åíü ïðîñòî. Ñàìîå èíòåðåñíîå â ýòîì ïðèìåðå - ôóíêöèÿ ñîðòèðîâêè. Îíà äîëæíà âñåãäà èìåòü äâà ïàðàìåòðà è âîçâðàùàòü ÷èñëî. Ïîðÿäîê ñîðòèðîâêè îïðåäåëÿåòñÿ çíàêîì âîçâðàùàåìîãî ÷èñëà. Åñëè ÷èñëî îòðèöàòåëüíîå - ïåðâûé àðãóìåíò äîëæåí â ìàññèâå ðàñïîëàãàòüñÿ ðàíüøå âòîðîãî, åñëè ïîëîæèòåëüíîå - ïîçæå. Åñëè ýëåìåíòû ðàâíû, òî îáû÷íî âîçâðàùàåòñÿ íîëü, à ïîðÿäîê ýëåìåíòîâ íå èçìåíÿåòñÿ.
 JavaScript1.1 è âûøå ðåàëèçîâàíû äîïîëíèòåëüíûå ñâîéñòâà è ìåòîäû ìàññèâîâ, ðàñøèðÿþùèå âîçìîæíîñòè äëÿ ïðîãðàììèñòîâ. Íàïðèìåð, äîáàâëåíû ìåòîäû concat() è slice(), ïîçâîëÿþùèå ñîáúåäèíèòü ìàññèâû è ïîëó÷èòü êóñîê ìàññèâà ñîîòâåòñòâåííî. Ê ñîæàëåíèþ, åù¸ íå âñå áðàóçåðû ïîääåðæèâàþò JavaScript1.1 è JavaScript1.2, ïîýòîìó ïðè ðàçðàáîòêå êðîññáðàóçåðíûõ ñêðèïòîâ èñïîëüçîâàòü íîâûå íåñòàíäàðòíûå ñâîéñòâà è ìåòîäû íàäî î÷åíü àêêóðàòíî.
Òàêèì îáðàçîì, ìàññèâû - ýòî îäèí èç íàèáîëåå ãèáêèõ è óäîáíûõ ìåõàíèçìîâ JavaScript, ò.ê. ïîçâîëÿåò ñ ë¸ãêîñòüþ ìàíèïóëèðîâàòü äàæå îòíîñèòåëüíî áîëüøèìè îáúåìàìè äàííûõ. Ìàññèâû íàäî èñïîëüçîâàòü âåçäå, ãäå çàðàíåå íåèçâåñòíî êîëè÷åñòâî õðàíèìûõ äàííûõ è èõ òèï.
Ñ äðóãîé ñòîðîíû, óâëåêàòüñÿ è äåëàòü ìàññèâû èç îäíîãî-äâóõ ýëåìåíòîâ òîæå íå ñòîèò. Ïåðåä ñîçäàíèåì ìàññèâà ïîäóìàéòå, à òî÷íî ëè îí íóæåí? Êàê ïîêàçûâàåò ïðàêòèêà - â ïîëîâèíå ñëó÷àåâ ïðîùå îáîéòèñü äâóìÿ ëèøíèìè ïåðåìåííûìè.