Massivlar — yaratish va asosiy metodlar — push, pop, shift, unshift, splice, slice
Muammodan boshlaylik
Siz maktab jurnali yozyapsiz. 30 ta o'quvchi bor. Har birini alohida o'zgaruvchida saqlash qanday ko'rinadi?
const oqivchi1 = "Jasur";
const oqivchi2 = "Malika";
const oqivchi3 = "Sardor";
// ... va yana 27 ta
Bu bilan hech narsa qilib bo'lmaydi. Hammani bir vaqtda ko'rib chiqish, sanash, saralash — bari imkonsiz. Yangi o'quvchi qo'shilsa — yangi o'zgaruvchi yaratish kerak.
Massiv — bir xil maqsaddagi qiymatlarni tartibli holda saqlash uchun.
Massiv nima?
Massiv — indekslangan qiymatlar ro'yxati. Har bir qiymatning o'rni (indeksi) bor — 0 dan boshlanadi.
["Jasur", "Malika", "Sardor"]
0 1 2
Bitta massiv ichida istalgan tur bo'lishi mumkin: sonlar, matnlar, ob'ektlar, hatto boshqa massivlar.
Hayotiy o'xshatma
Poyezd vagonlarini tasavvur qiling. Har bir vagon — massivning bir elementi. Vagonlar tartibli — 1-vagon, 2-vagon, 3-vagon. Oxiriga vagon qo'shish oson — lokomotivdan uzoqda. Boshiga qo'shish — barcha vagonlarni siljitish kerak. O'rtasiga qo'shish — yanada qiyin.
Massiv metodlari ham xuddi shunday: qayerga qo'shish yoki olinayotganiga qarab — qulay yoki qimmat.
Massiv yaratish
// Eng ko'p ishlatiladigan usul — literal
const mevalar = ["olma", "nok", "o'rik"];
// Bo'sh massiv
const royxat = [];
// Aralash turlar (mumkin, lekin kam ishlatiladi)
const aralash = [1, "matn", true, null];
// Array.from — boshqa narsadan massiv yasash
const harflar = Array.from("salom"); // ["s", "a", "l", "o", "m"]
const sonlar = Array.from({ length: 5 }, (_, i) => i + 1); // [1, 2, 3, 4, 5]
Elementga murojaat
const mevalar = ["olma", "nok", "o'rik"];
console.log(mevalar[0]); // "olma" ← birinchi element (0 dan boshlanadi)
console.log(mevalar[2]); // "o'rik" ← uchinchi element
console.log(mevalar[5]); // undefined — bunday indeks yo'q
console.log(mevalar.length); // 3 — elementlar soni
console.log(mevalar[mevalar.length - 1]); // "o'rik" — oxirgi element
Nima uchun 0 dan boshlanadi? Bu xotira manzili hisoblash bilan bog'liq — massivning boshi + 0 offset = birinchi element. Barcha zamonaviy tillar shu an'anani saqlaydi.
push va pop — oxiri bilan ishlash
push — oxiriga element qo'shadi. Yangi uzunlikni qaytaradi.
pop — oxiridan elementni olib chiqaradi. O'sha elementni qaytaradi.
const navbat = ["Ali", "Vali"];
navbat.push("Soli"); // ← oxiriga qo'shdi
console.log(navbat); // ["Ali", "Vali", "Soli"]
const oxirgi = navbat.pop(); // ← oxiridan oldi
console.log(oxirgi); // "Soli"
console.log(navbat); // ["Ali", "Vali"]
push bir vaqtda bir nechta element qabul qiladi:
const sonlar = [1, 2];
sonlar.push(3, 4, 5);
console.log(sonlar); // [1, 2, 3, 4, 5]
shift va unshift — boshi bilan ishlash
unshift — boshiga element qo'shadi. Yangi uzunlikni qaytaradi.
shift — boshidan elementni olib chiqaradi. O'sha elementni qaytaradi.
const galma = ["Vali", "Soli"];
galma.unshift("Ali"); // ← boshiga qo'shdi
console.log(galma); // ["Ali", "Vali", "Soli"]
const birinchi = galma.shift(); // ← boshidan oldi
console.log(birinchi); // "Ali"
console.log(galma); // ["Vali", "Soli"]
Nima uchun shift sekin?
push/pop — O(1). Oxiri bilan ishlash — faqat bir joy o'zgaradi.
shift/unshift — O(n). Boshi bilan ishlash — barcha elementlarning indeksi o'zgaradi. 1000 ta elementli massivda shift barcha 1000 elementni siljitadi.
unshift("X") qilganda:
["A", "B", "C"]
0 1 2
Natija:
["X", "A", "B", "C"]
0 1 2 3
↑ ↑ ↑
barcha elementlar siljidi
Ko'p o'chirish/qo'shish kerak bo'lsa — boshidan emas, oxiridan ishlang. Yoki Map/boshqa tuzilmalar ko'rib chiqing.
splice — o'rtadan qo'shish va olib chiqarish
splice(boshlash, nechta_ochirish, ...qoshiluvchilar)
O'chirish:
const ranglar = ["qizil", "yashil", "ko'k", "sariq"];
const olingan = ranglar.splice(1, 2); // 1-indeksdan 2 ta olib chiqar
console.log(olingan); // ["yashil", "ko'k"] ← olib chiqilganlar
console.log(ranglar); // ["qizil", "sariq"] ← o'zgargan massiv
Qo'shish:
const ranglar = ["qizil", "sariq"];
ranglar.splice(1, 0, "yashil", "ko'k"); // 1-indeksga, 0 ta o'chirmasdan, ikki rang qo'sh
console.log(ranglar); // ["qizil", "yashil", "ko'k", "sariq"]
Almashtirish (o'chirish + qo'shish birga):
const ranglar = ["qizil", "yashil", "ko'k"];
ranglar.splice(1, 1, "binafsha"); // 1-indeksdagini olib, "binafsha" qo'y
console.log(ranglar); // ["qizil", "binafsha", "ko'k"]
⚠️
splicemassivning o'zini o'zgartiradi (mutating).
slice — kesim olish
slice(boshlash, oxir) — massivni o'zgartirmasdan, bir qismini yangi massiv sifatida qaytaradi.
const harflar = ["a", "b", "c", "d", "e"];
console.log(harflar.slice(1, 3)); // ["b", "c"] ← 1-indeksdan 3-gacha (3 kirmaydi)
console.log(harflar.slice(2)); // ["c", "d", "e"] ← 2-dan oxirigacha
console.log(harflar.slice(-2)); // ["d", "e"] ← oxiridan 2 ta
console.log(harflar); // ["a", "b", "c", "d", "e"] ← o'zgarmadi ✅
Massivni nusxalash uchun:
const asl = [1, 2, 3];
const nusxa = asl.slice(); // to'liq nusxa
nusxa.push(4);
console.log(asl); // [1, 2, 3] — o'zgarmadi
console.log(nusxa); // [1, 2, 3, 4]
splice va slice farqi — eng ko'p chalkashtiriladi
splice |
slice |
|
|---|---|---|
| Aslni o'zgartiradi | ✅ ha | ❌ yo'q |
| Qaytaradi | olib chiqilgan elementlar | yangi massiv (kesim) |
| Ishlatilishi | o'chirish/qo'shish | nusxa/kesim olish |
Tez-tez uchraydigan xatolar
push ning qaytarish qiymatini elementga qo'shish:
const arr = [1, 2];
// ❌ push yangi uzunlikni qaytaradi, elementni emas
const natija = arr.push(3);
console.log(natija); // 3 — bu uzunlik, element emas!
// ✅ Avval qo'shing, keyin elementga murojaat qiling
arr.push(3);
console.log(arr[arr.length - 1]); // 3
Manfiy indeks ishlamaydi:
const arr = [10, 20, 30];
console.log(arr[-1]); // undefined ❌ — Python emas bu!
console.log(arr[arr.length - 1]); // 30 ✅
console.log(arr.at(-1)); // 30 ✅ — zamonaviy usul
splice va slice ni chalkashtirib yuborish:
const arr = [1, 2, 3, 4, 5];
// splice — aslni o'zgartiradi
arr.splice(1, 2);
console.log(arr); // [1, 4, 5] ← 2 ta element o'chirildi
// slice — aslni o'zgartirmaydi
const arr2 = [1, 2, 3, 4, 5];
const kesim = arr2.slice(1, 3);
console.log(arr2); // [1, 2, 3, 4, 5] ← o'zgarmadi
console.log(kesim); // [2, 3]
Sababi: splice — "kelib kesib ol" (destructive), slice — "nusxa ko'chirib ol" (non-destructive). Ikkala nomida ham "lice" bo'lsa-da, ishlashi tubdan farqli.
length ni noto'g'ri tushunish:
const arr = ["a", "b", "c"];
// length — elementlar soni, oxirgi indeks emas
console.log(arr.length); // 3
console.log(arr[arr.length]); // undefined ❌ — indeks 3, holbuki oxirgi 2
console.log(arr[arr.length - 1]); // "c" ✅
Xulosa
Massiv — tartibli qiymatlar ro'yxati, indeks 0 dan boshlanadi.
| Metod | Nima qiladi | Aslni o'zgartiradi? |
|---|---|---|
push(el) |
oxiriga qo'shadi, uzunlik qaytaradi | ✅ |
pop() |
oxiridan oladi, elementni qaytaradi | ✅ |
unshift(el) |
boshiga qo'shadi, uzunlik qaytaradi | ✅ |
shift() |
boshidan oladi, elementni qaytaradi | ✅ |
splice(i, n) |
o'rtadan olib chiqadi / qo'shadi | ✅ |
slice(i, j) |
kesim oladi, yangi massiv qaytaradi | ❌ |
Performance: push/pop — tez (O(1)). shift/unshift/splice — sekin (O(n)).
Keyingi dars
23-dars: Massiv metodlari — map, filter, reduce