Obyektlar qadriyatlar toâplamini saqlashga imkon beradi. Juda soz.
Ammo koâpincha biz roâyhatlangan toâplamga ehtiyoj sezamiz, bu yerda bizda 1 chi, 2 chi, 3 chi element va h.k. Masalan, biz biror narsaning roâyxatini saqlashimiz kerak: foydalanuvchilar, tovarlar, HTML elementlari va boshqalar.
Bu erda obyektni ishlatish qulay emas, chunki u elementlarning tartibini boshqarish usullarini taqdim etmaydi. Mavjud boâlganlar orasida âoârtasigaâ yangi xususiyat kiritolmaymiz. Obyektlar bunday foydalanish uchun moâljallanmagan.
Roâyhatlangan toâplamlarni saqlash uchun Array nomli maxsus maâlumotlar tuzilishi mavjud.
Deklaratsiya
Boâsh massiv yaratish uchun ikkita sintaksis mavjud:
let arr = new Array();
let arr = [];
Deyarli har doim ikkinchi sintaksis ishlatiladi. Qavsda dastlabki elementlarni yetkazib berishimiz mumkin:
let fruits = ["Olma", "Apelsin", "Uzum"];
Massiv elementlari noldan boshlab raqamlangan.
Elementni toârtburchak qavs ichida uning soniga koâra olishimiz mumkin:
let fruits = ["Olma", "Apelsin", "Uzum"];
alert( fruits[0] ); // Olma
alert( fruits[1] ); // Apelsin
alert( fruits[2] ); // Uzum
Biz elementni almashtirishimiz mumkin:
fruits[2] = 'Nok'; // now ["Olma", "Apelsin", "Nok"]
â¦Yoki massivga yangisini qoâshish:
fruits[3] = 'Limon'; // now ["Olma", "Apelsin", "Nok", "Limon"]
Massivdagi elementlarning umumiy soni uning uzunligi length dir:
let fruits = ["Olma", "Apelsin", "Uzum"];
alert( fruits.length ); // 3
Biz massivni toâliq koârsatish uchun alert dan ham foydalanishimiz mumkin.
let fruits = ["Olma", "Apelsin", "Uzum"];
alert( fruits ); // Olma,Apelsin,Uzum
Massiv har qanday turdagi elementlarni saqlashi mumkin.
Masalan:
// qiymatlar aralashmasi
let arr = [ 'Olma', { name: 'Oybek' }, true, function() { alert('salom'); } ];
// obyektni 1 chi indeksini oling va keyin uning nomini ko'rsating
alert( arr[1].name ); // Oybek
// funktsiyani 3 chi indeksini oling va uni ishga tushiring
arr[3](); // salom
Massiv, xuddi obyekt singari, vergul bilan tugashi mumkin:
let fruits = [
"Olma",
"Apelsin",
"Uzum",
];
âOsilgan vergulâ uslubi elementlarni kiritishni/olib tashlashni osonlashtiradi, chunki barcha satrlar bir xil boâladi.
Usullar pop/push, shift/unshift
A navbat â bu massivning eng keng tarqalgan ishlatilishlaridan biri. Kompyuter fanida bu ikkita operatsiyani qoâllab-quvvatlaydigan elementlarning tartiblangan toâplamini anglatadi:
pushelementni oxiriga qoâshib qoâyadi.shiftboshidagi element olib tashlanadi, shunday qilib, ikkinchi element birinchiga aylanadi.
Massivlar ikkala operatsiyani qoâllab-quvvatlaydi.
Amalda bu bizga koâpincha kerak. Masalan, ekranda koârsatilishi kerak boâlgan xabarlar navbati.
Massivlar uchun yana bir holat mavjud â stek deb nomlangan maâlumotlar tuzilishi .
U ikkita operatsiyani qoâllab-quvvatlaydi:
pushoxiriga element qoâshadi.popoxiridan element oladi.
Shunday qilib, yangi elementlar har doim âoxiridanâ qoâshiladi yoki olinadi.
Stek odatda kartalar toâplami sifatida tasvirlanadi: yuqoriga yangi kartalar qoâshiladi yoki yuqoridan olinadi:
JavaScript-dagi massivlar navbat sifatida ham, stek sifatida ham ishlashi mumkin. Ular sizga elementlarni boshiga yoki oxiriga qoâshish/olib tashlash imkonini beradi.
Kompyuter fanida bunga imkon beradigan maâlumotlar tuzilishi deque deb nomlanadi.
Massiv oxiri bilan ishlaydigan usullar:
pop-
Massivning oxirgi elementini ajratib oladi va qaytaradi:
let fruits = ["Olma", "Apelsin", "Nok"]; alert( fruits.pop() ); // "Nok" ni olib tashlang va chiqaring alert( fruits ); // Olma, Apelsin push-
Elementni massivning oxiriga qoâshadi:
let fruits = ["Olma", "Apelsin"]; fruits.push("Nok"); alert( fruits ); // Olma, Apelsin, Nokfruits.push(...) chaqiruvifruits[fruits.length] = â¦` ga teng.
Massivning boshi bilan ishlaydigan usullar:
shift-
Massivning birinchi elementini ajratib oladi va uni qaytaradi:
let fruits = ["Olma", "Apelsin", "Nok"]; alert( fruits.shift() ); // Olmani olib tashlaydi va qaytaradi alert( fruits ); // Apelsin, Nok unshift-
Elementni massiv boshiga qoâshadi:
let fruits = ["Apelsin", "Nok"]; fruits.unshift('Olma'); alert( fruits ); // Olma, Apelsin, Nok
push va unshift usullari bir vaqtning oâzida bir nechta elementlarni qoâshishi mumkin:
let fruits = ["Olma"];
fruits.push("Apelsin", "Nok");
fruits.unshift("Ananas", "Limon");
// ["Ananas", "Limon", "Olma", "Apelsin", "Nok"]
alert( fruits );
Ichki massiv qurilma
Massiv â obyektlarning maxsus turdagi koârinishi. arr[0] xususiyatiga kirish uchun ishlatiladigan kvadrat qavslar asosan obj[key] kabi oddiy kalit kirish sintaksisidir, bu yerda obj rolida massiv va key sifatida raqamli indeks mavjud.
Ular roâyhatlangan maâlumotlar toâplamlari va length xususiyati bilan ishlash uchun maxsus usullarni taqdim etadigan obyektlarni kengaytiradi. Ammo aslida bu hali ham obyekt.
Esingizda boâlsa, JavaScript-da faqat 7 ta asosiy tur mavjud. Massiv obyektdir va shu bilan obyekt kabi oâzini tutadi.
Masalan, u havola orqali koâchiriladi:
let fruits = ["Banan"]
let arr = fruits; // havola orqali nusxalash (ikkita o'zgaruvchan bir massivga murojaat qiladi)
alert( arr === fruits ); // true
arr.push("Nok"); // havola yordamida massivni o'zgartiring
alert( fruits ); // Banan, Nok - 2 items now
â¦Ammo massivlarni chindan ham maxsus qiladigan narsa ularning ichki koârinishi. Interpretatorlar oâz elementlarini tutashgan xotira maydonida, xuddi shu bobdagi rasmlarda tasvirlanganidek, ketma-ket saqlashga harakat qiladi va massivlarni chindan ham tez ishlashini taâminlash uchun boshqa optimallashtirishlar ham mavjud.
Ammo biz âroâyhatlangan toâplamâ singari massiv bilan ishlashni toâhtatsak va u bilan odatdagi obyekt kabi ishlay boshlasak, ularning barchasi buziladi.
Masalan, texnik jihatdan biz buni qila olamiz:
let fruits = []; // massiv yaratish
fruits[99999] = 5; // indeks uzunligidan ancha kattaroq xususiyatni tayinlash
fruits.age = 25; // hohlagan nom bilan xususiyat yaratish
Bu mumkin, chunki massivlar aslida obyektlardir. Biz ularga har qanday xususiyatlarni qoâshishimiz mumkin.
Ammo interpretator biz oddiy obyekt kabi massiv bilan ishlayotganimizni koâradi. Massivga xos optimallashtirish bunday holatlarga mos kelmaydi va oâchiriladi, ularning foydalari yoâqoladi.
Massivni notoâgâri ishlatish usullari:
arr.test = 5kabi raqamli boâlmagan xususiyatni qoâshish.- Teshiklarni yaratish, masalan:
arr[0]va keyinarr[1000]qoâshish (va ular orasida hech narsa yoâq). - Massivni teskari tartibda toâldirish, masalan
arr[1000],arr[999]va boshqalar.
Iltimos, roâyhatlangan massivlar bilan ishlash uchun massivlarni maxsus tuzilmalar deb hisoblang. Buning uchun ular maxsus usullarni taqdim etishadi. Massivlar ketma ket roâyhatlangan maâlumotlar bilan ishlash uchun JavaScript interpretatorining ichida ehtiyotkorlik bilan sozlangan, iltimos ularni shu tarzda ishlating. Agar sizga kalitlangan xususiyatlar kerak boâlsa, ehtimol siz odatdagi obyektni {} ishlatishiz kerak.
Samaradorlik
push/pop tez ishlaydi, shift/unshift esa sekin ishlaydi.
Nega massivning boshidan koâra uning oxiri bilan ishlash tezroq? Keling, ijro paytida nima boâlishini koârib chiqaylik:
fruits.shift(); // boshidan 1 ta elementni oling
Elementni 0 raqami bilan olib tashlash yetarli emas. Boshqa elementlarning ham raqamlarini oâzgartirish kerak.
shift operatsiyasi uchta narsani bajarishi kerak:
0indeksli elementni olib tashlash.- Barcha elementlarni chapga siljitish, ularning raqamlarini
1dan0ga,2dan1ga va hokazo. lengthxususiyatini yangilash.
Massivda qancha element boâlsa, ularni siljitish uchun koâproq vaqt, xotira ishlari koâproq boâladi.
Shunga oâxshash narsa unshift bilan sodir boâladi: massiv boshiga element qoâshish uchun avval mavjud elementlarni indekslarini oshirib, oâng tomonga siljitishi kerak.
Va push/pop nima? Ular hech narsani siljitishga hojat yoâq. Elementni oxiridan ajratib olish uchun pop usuli indeksni tozalaydi va length ni qisqartiradi.
pop operatsiyasi uchun harakatlar:
fruits.pop(); // oxiridan 1 ta elementni oling
pop usuli hech narsani siljitishni hojat yoâq, chunki boshqa elementlar oâz indekslarini saqlaydi. Shuning uchun u juda tezkor.
Shunga oâxshash narsa push usuli bilan.
Tsiklar
Elementlarni roâyhatlashning eng qadimgi usullaridan biri bu for tsikli:
let arr = ["Olma", "Apelsin", "Nok"];
for (let i = 0; i < arr.length; i++) {
alert( arr[i] );
}
Ammo massivlar uchun for..of tsiklning yana bir shakli mavjud:
let fruits = ["Olma", "Apelsin", "Uzum"];
// massiv elementlari ustida takrorlanadi
for (let fruit of fruits) {
alert( fruit );
}
for..of joriy element raqamiga kirish huquqini bermaydi, faqat uning qiymatiga, lekin aksariyat hollarda bu yetarli. Va bu qisqaroq.
Texnik jihatdan, massivlar obâekt boâlgani uchun for..in dan foydalanish ham mumkin:
let arr = ["Olma", "Apelsin", "Nok"];
for (let key in arr) {
alert( arr[key] ); // Olma, Apelsin, Nok
}
Ammo bu aslida yomon fikr. U bilan bogâliq muammolar mavjud:
-
For..intsikli nafaqat raqamli xususiyatlarni, balki barcha xususiyatlarni takrorlaydi. Brauzerda va boshqa muhitda âmassivga oâxshashâ deb nomlangan obâektlar mavjud, ular massivlarga oâxshaydi. Yaâni, ularlengthva indekslar xususiyatlariga ega, ammo ular boshqa raqamli boâlmagan xususiyatlar va usullarga ham ega boâlishi mumkin, ular odatda bizga kerak emas.for..intsikl ularni roâyxatlaydi. Agar biz massivga oâxshash narsalar bilan ishlashimiz kerak boâlsa, unda bu âqoâshimchaâ xususiyatlar muammoga aylanishi mumkin. -
for..intsikli massivlar uchun emas, balki umumiy obyektlar uchun optimallashtirilgan va shuning uchun 10-100 marta sekinroq. Albatta, bu hali ham juda tez. Tezlashish faqat toâsiqlarda muhim boâlishi mumkin yoki ahamiyatsiz boâlib tuyulishi mumkin. Ammo shunga qaramay, farqni bilishimiz kerak.
Odatda, biz for..in massivlar uchun ishlatmasligimiz kerak.
âLengthâ haqida soâz
Biz massivni oâzgartirganda length xususiyati avtomatik ravishda yangilanadi. Aniqroq aytganda, bu aslida massivdagi qiymatlar soni emas, balki eng katta sonli indeks va plyus bir.
Masalan, katta indeksli bitta element katta uzunlikni beradi:
let fruits = [];
fruits[123] = "Olma";
alert( fruits.length ); // 124
Eâtibor bering, biz odatda bunday massivlardan foydalanmaymiz.
length xususiyati bilan bogâliq yana bir qiziq narsa shundaki, u tayinlanishi mumkin.
Agar uni qoâlda oshirsak, qiziq narsa boâlmaydi. Ammo biz uni kamaytirsak, massiv qisqartiriladi. Jarayon qaytarib boâlmaydigan, bu yerda misol:
let arr = [1, 2, 3, 4, 5];
arr.length = 2; // 2 ta elementgacha qisqartiring
alert( arr ); // [1, 2]
arr.length = 5; // uzunlikni qaytaring
alert( arr[3] ); // undefined: qiymatlar qayta qaytarilmaydi
Shunday qilib, massivni tozalashning eng oddiy usuli: arr.length = 0;.
new Array()
Massiv yaratish uchun yana bitta sintaksis mavjud:
let arr = new Array("Olma", "Nok", "va hokazo");
U kamdan-kam qoâllaniladi, chunki toârtburchaklar [] qisqaroq. Bundan tashqari, bu bilan juda ayyor xususiyati mavjud.
Agar new Array raqamli bitta argument bilan chaqirilsa, u elementlarsiz, lekin berilgan uzunlikdagi massivni yaratadi.
Keling, qanday qilib ayanchli xizmatni taqdim etishni koârib chiqaylik:
let arr = new Array(2); // u [2] massiv yaratadimi?
alert( arr[0] ); // undefined! elementlar yo'q.
alert( arr.length ); // length 2
Yuqoridagi kodda new Array(raqam) barcha elementlari undefined.
Bunday kutilmagan hodisalardan qochish uchun, odatda nima qilayotganimizni bilmasak, toârtburchak qavslardan foydalanamiz.
Koâp oâlchovli massivlar
Massivlar massiv boâlgan elementlarga ega boâlishi mumkin. Matritsalarni saqlash uchun biz uni koâp oâlchovli massivlar uchun ishlatishimiz mumkin:
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
alert( matrix[1][1] ); // markaziy element
toString
Massivlar elementlarning vergul bilan ajratilgan roâyxatini qaytaradigan toString usulini oâz ichiga oladi.
Masalan:
let arr = [1, 2, 3];
alert( arr ); // 1,2,3
alert( String(arr) === '1,2,3' ); // true
Bundan tashqari, buni sinab koâraylik:
alert( [] + 1 ); // "1"
alert( [1] + 1 ); // "11"
alert( [1,2] + 1 ); // "1,21"
Massivlarda Symbol.toPrimitive, shuningdek, hatto valueOf yoâq, ular faqat toString konvertatsiyasini amalga oshiradilar, shuning uchun bu erda [] boâsh satrga aylanadi, [1] "1" "va [1,2] "1,2" ga aylanadi.
Binar plyus "+" operatori massivga biror narsa qoâshganda, u matnga aylantiriladi, shuning uchun keyingi qadam quyidagicha koârinadi:
alert( "" + 1 ); // "1"
alert( "1" + 1 ); // "11"
alert( "1,2" + 1 ); // "1,21"
<<<<<<< HEAD
Xulosa
=======
Donât compare arrays with ==
Arrays in JavaScript, unlike some other programming languages, shouldnât be compared with operator ==.
This operator has no special treatment for arrays, it works with them as with any objects.
Letâs recall the rules:
- Two objects are equal
==only if theyâre references to the same object. - If one of the arguments of
==is an object, and the other one is a primitive, then the object gets converted to primitive, as explained in the chapter Obyektlarni ibtidoiylarga aylantirish. - â¦With an exception of
nullandundefinedthat equal==each other and nothing else.
The strict comparison === is even simpler, as it doesnât convert types.
So, if we compare arrays with ==, they are never the same, unless we compare two variables that reference exactly the same array.
For example:
alert( [] == [] ); // false
alert( [0] == [0] ); // false
These arrays are technically different objects. So they arenât equal. The == operator doesnât do item-by-item comparison.
Comparison with primitives may give seemingly strange results as well:
alert( 0 == [] ); // true
alert('0' == [] ); // false
Here, in both cases, we compare a primitive with an array object. So the array [] gets converted to primitive for the purpose of comparison and becomes an empty string ''.
Then the comparison process goes on with the primitives, as described in the chapter Turlarni o'zgartirish:
// after [] was converted to ''
alert( 0 == '' ); // true, as '' becomes converted to number 0
alert('0' == '' ); // false, no type conversion, different strings
So, how to compare arrays?
Thatâs simple: donât use the == operator. Instead, compare them item-by-item in a loop or using iteration methods explained in the next chapter.
Summary
fb4fc33a2234445808100ddc9f5e4dcec8b3d24c
Array â roâyhatlangan maâlumotlar elementlarini saqlash va boshqarish uchun mos boâlgan maxsus obâekt turi.
-
Deklaratsiya:
// kvadrat qavslar (odatiy) let arr = [item1, item2...]; // new Array (juda kam ishlatiladi) let arr = new Array(item1, item2...);new Arryay(raqam)berilgan uzunlikdagi, ammo elementlarsiz massivni yaratadi.
<<<<<<< HEAD
lengthxususiyati â bu massiv uzunligi yoki aniqrogâi, uning oxirgi son koârsatkichi plyus bir. U massiv usullari bilan avtomatik ravishda oârnatiladi.- Agar
lengthni qo`lda qisqartirsak, massiv qisqartiriladi. ======= - The
lengthproperty is the array length or, to be precise, its last numeric index plus one. It is auto-adjusted by array methods. - If we shorten
lengthmanually, the array is truncated.
fb4fc33a2234445808100ddc9f5e4dcec8b3d24c
Biz quyidagi amallar bilan massivni ishlatishimiz mumkin:
<<<<<<< HEAD
push(...ma'lumot)oxirigama'lumotqoâshiladi.pop()elementni oxiridan olib tashlaydi va qaytaradi.shift()elementni boshidan olib tashlaydi va qaytaradi.unshift(...ma'lumot)elementlarni boshiga qoâshadi. =======push(...items)addsitemsto the end.pop()removes the element from the end and returns it.shift()removes the element from the beginning and returns it.unshift(...items)addsitemsto the beginning.
fb4fc33a2234445808100ddc9f5e4dcec8b3d24c
Massiv elementlari boâylab yurish uchun:
for (let i=0; i<arr.length; i++)â eng tez ishlaydi, eski brauzerga mos keladi.for (let items of arr)â faqat buyumlar(items) uchun zamonaviy sintaksis,for (let i in arr)â hech qachon foydalanmang.
<<<<<<< HEAD Biz qatorlarga qaytamiz va Massiv usullari bobida elementlarni qoâshish, olib tashlash, ajratish va saralash uchun koâproq usullarni oârganamiz.
To compare arrays, donât use the == operator (as well as >, < and others), as they have no special treatment for arrays. They handle them as any objects, and itâs not what we usually want.
Instead you can use for..of loop to compare arrays item-by-item.
fb4fc33a2234445808100ddc9f5e4dcec8b3d24c
We will continue with arrays and study more methods to add, remove, extract elements and sort arrays in the next chapter Massiv usullari.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)