Massivlar va obyektlar

Hozircha har bir o'zgaruvchida bittadan qiymat saqladik: bitta ism, bitta son. Haqiqiy dasturlarda esa ma'lumot ko'p bo'ladi: sinfdagi 30 ta o'quvchining bahosi, do'kondagi yuzlab mahsulot, kunlik vazifalar ro'yxati. Bu darsda ko'p qiymatni bitta joyda saqlashni o'rganamiz: tartibli ro'yxat uchun massiv, xususiyatlari bor narsa uchun obyekt.

Bu darsda

  • Massiv yaratish, indeks va length
  • Element qo'shish, olib tashlash va qidirish
  • Massiv bo'ylab aylanish: for, for...of, forEach
  • map va filter — massivdan yangi massiv yasash
  • Obyekt: kalit va qiymat, xususiyatlarni o'qish va o'zgartirish
  • Obyektlar massivi va JSON formati

Nima uchun massiv kerak?

Tasavvur qiling, besh kunlik baholaringizni saqlamoqchisiz. Hozirgi bilimimiz bilan shunday yozardik:

let baho1 = 5;
let baho2 = 4;
let baho3 = 3;
let baho4 = 5;
let baho5 = 4;

Beshta bo'lsa-ku mayli, 30 ta yoki 1000 ta bo'lsa-chi? Ularning o'rtachasini hisoblash uchun hammasini birma-bir qo'shib chiqish kerak bo'lardi. Buning o'rniga bitta massiv (inglizcha array) ishlatamiz — u bir nechta qiymatni tartib bilan saqlaydigan bitta o'zgaruvchi.

Massivni poyezdga o'xshatish mumkin. Poyezd bitta, lekin unda bir nechta vagon bor. Har bir vagonning o'z raqami va ichida yuki bor. Kerak bo'lsa, oxiriga yangi vagon ulash yoki birini uzib olish mumkin.

Massiv yaratish

Massiv kvadrat qavs [ ] ichida yoziladi, qiymatlar vergul bilan ajratiladi. Massiv ichidagi har bir qiymat element deyiladi:

const mevalar = ["olma", "anor", "uzum", "behi"];
const baholar = [5, 4, 3, 5, 4];
const bosh = [];   // hali elementi yo'q massiv

console.log(mevalar);
console.log(baholar);
console.log(bosh);
console.log("Mevalar soni:", mevalar.length);

length («uzunlik») — massivdagi elementlar soni. Bitta massivda turli turdagi qiymatlar bo'lishi mumkin (masalan, [1, "salom", true]), lekin odatda bir xil narsalar saqlanadi: faqat sonlar yoki faqat ismlar.

Massivga ko'plikdagi nom bering: mevalar, baholar, foydalanuvchilar. Shunda nomidan ichida bir nechta narsa borligi darhol bilinadi.

Indeks — elementning tartib raqami

Har bir elementning o'z raqami bor — uni indeks (inglizcha index) deyiladi. Eng muhim qoida: sanash 0 dan boshlanadi. Birinchi element — 0-indeksda, ikkinchisi — 1-indeksda va hokazo.

mevalar massivi: to'rtta katakcha, ularning ostida 0 dan 3 gacha indekslar qiymat "olma" "anor" "uzum" "behi" const mevalar = indeks 0 1 2 3 mevalar[0] mevalar[1] mevalar[2] mevalar[3] mevalar.length = 4 (oxirgi indeks esa 3)
To'rt elementli massiv: indekslar 0, 1, 2, 3.

Elementni olish uchun massiv nomidan keyin kvadrat qavsda indeksni yozamiz:

const mevalar = ["olma", "anor", "uzum", "behi"];

console.log(mevalar[0]);                   // birinchi element
console.log(mevalar[2]);                   // uchinchi element
console.log(mevalar[mevalar.length - 1]);  // oxirgi element
console.log(mevalar[10]);                  // bunday indeks yo'q

// Elementni almashtirish
mevalar[1] = "nok";
console.log(mevalar);

Nimalarga e'tibor berish kerak:

Qo'shish va olib tashlash

Massivning tayyor metodlari (inglizcha method) bor — massivga «biriktirilgan» funksiyalar. Ular nuqta orqali chaqiriladi: mevalar.push("anor"). Eng ko'p ishlatiladigan to'rttasi:

MetodNima qiladi
push(x)Oxiriga element qo'shadi
pop()Oxirgi elementni olib tashlaydi va uni qaytaradi
unshift(x)Boshiga element qo'shadi
shift()Birinchi elementni olib tashlaydi va uni qaytaradi

Do'kondagi navbatni eslang: yangi kelgan odam navbat oxiriga turadi (push), kassada esa eng oldingi odamga xizmat ko'rsatiladi va u navbatdan chiqadi (shift).

const navbat = ["Ali", "Vali"];

navbat.push("Gulnora");        // oxiriga qo'shildi
console.log(navbat);

navbat.unshift("Bobur");       // boshiga qo'shildi
console.log(navbat);

const birinchi = navbat.shift();  // birinchisi chiqdi
console.log(birinchi, "xizmatdan o'tdi");

const oxirgi = navbat.pop();      // oxirgisi chiqdi
console.log(oxirgi, "navbatni tark etdi");

console.log(navbat, "— qoldi:", navbat.length);

shift() va pop() olib tashlangan elementni qaytaradi, shuning uchun uni o'zgaruvchiga saqlab qo'yish mumkin (birinchi, oxirgi).

Qidirish va boshqa foydali metodlar

MetodNima qiladiNatija
includes(x)Massivda x bormi?true yoki false
indexOf(x)x qaysi indeksda turibdi?Indeks, topilmasa -1
join(", ")Elementlarni bitta satrga birlashtiradiSatr
slice(1, 3)1-indeksdan 3-indeksgacha bo'lgan qismini nusxalaydi (3 kirmaydi)Yangi massiv
const shaharlar = ["Toshkent", "Samarqand", "Buxoro", "Xiva"];

console.log(shaharlar.includes("Buxoro"));     // bormi?
console.log(shaharlar.includes("Parij"));
console.log(shaharlar.indexOf("Samarqand"));   // qayerda?
console.log(shaharlar.indexOf("Parij"));       // yo'q bo'lsa -1

console.log(shaharlar.join(" → "));
console.log(shaharlar.slice(1, 3));
console.log(shaharlar);   // asl massiv o'zgarmadi

push, pop, shift, unshift massivning o'zini o'zgartiradi. slice, join, includes esa massivga tegmaydi — faqat natija qaytaradi.

Massiv bo'ylab aylanish

Massiv bilan eng ko'p bajariladigan ish — har bir element bilan nimadir qilish: chiqarish, qo'shish, tekshirish. Buning uchta usuli bor.

1. Oddiy for

14-darsdagi for sikli indekslarni 0 dan length - 1 gacha aylanib chiqadi. Indeks kerak bo'lganda qulay.

2. for...of

for (const baho of baholar) — «baholar ichidagi har bir baho uchun». Indeks bilan ishlash shart emas: har aylanishda baho o'zgaruvchisiga navbatdagi element tushadi. Eng tushunarli usul.

3. forEach

baholar.forEach(function (baho, indeks) { … }) — massivning metodi: u har bir element uchun siz bergan funksiyani chaqiradi va unga elementni (kerak bo'lsa indeksini ham) beradi.

const baholar = [5, 4, 3, 5, 4];

// 1) Oddiy for — indeks bilan
for (let i = 0; i < baholar.length; i++) {
  console.log(i + "-indeks:", baholar[i]);
}

// 2) for...of — yig'indini hisoblaymiz
let yigindi = 0;
for (const baho of baholar) {
  yigindi = yigindi + baho;
}
console.log("Yig'indi:", yigindi);
console.log("O'rtacha:", yigindi / baholar.length);

// 3) forEach — har bir element uchun funksiya
baholar.forEach(function (baho, indeks) {
  if (baho === 5) {
    console.log("A'lo baho, indeksi:", indeks);
  }
});

O'rtachani hisoblash usuli bilan tanishib oling: avval yigindi = 0, keyin har bir elementni unga qo'shamiz va oxirida elementlar soniga bo'lamiz. Bu «yig'ib borish» usuli juda ko'p masalada kerak bo'ladi.

map va filter — massivdan yangi massiv

Ikki vazifa juda tez-tez uchraydi: har bir elementni o'zgartirish va faqat kerakli elementlarni tanlab olish. Ular uchun maxsus metodlar bor. Lekin avval funksiyani qisqa yozish usuli bilan tanishamiz.

Strelkali funksiya

Strelkali funksiya (inglizcha arrow function) — funksiyaning qisqa yozuvi. Quyidagi ikkita funksiya bir xil ish qiladi:

// Oddiy funksiya
function ikkilantir(x) {
  return x * 2;
}

// Xuddi shu — strelkali funksiya
const ikkilantir2 = (x) => x * 2;

=> belgisining chap tomonida parametrlar, o'ng tomonida natija turadi. Natija bitta ifoda bo'lsa, return va figurali qavslar kerak emas. Uni «x berilsa, x * 2 ni qaytar» deb o'qing.

map va filter

Bir savat olma bor. map — har bir olmani artib, yangi savatga solish: olmalar soni o'zgarmaydi, lekin har biri boshqacha. filter — faqat qizil olmalarni tanlab olish: savatda kamroq olma qoladi.

const narxlar = [12000, 4000, 25000, 8000, 3000];

// map — har bir narxni "ming" ko'rinishiga keltiramiz
const qisqa = narxlar.map((narx) => narx / 1000 + " ming");
console.log(qisqa);

// filter — faqat 10 000 so'mdan arzonlarini qoldiramiz
const arzonlar = narxlar.filter((narx) => narx < 10000);
console.log(arzonlar);

// Asl massiv o'zgarmadi
console.log(narxlar);

map va filter asl massivga tegmaydi, har doim yangi massiv qaytaradi. Ularga oddiy funksiya berish ham mumkin: narxlar.filter(function (narx) { return narx < 10000; }) — natija bir xil, faqat uzunroq.

const va massiv

Massivni const bilan e'lon qildik, lekin push bilan baribir o'zgartira oldik. Qanday qilib? const o'zgaruvchiga boshqa massivni berishni taqiqlaydi, lekin massivning ichini o'zgartirishga ruxsat beradi:

const mevalar = ["olma"];

mevalar.push("anor");   // mumkin: massivning ichi o'zgaryapti
console.log(mevalar);

mevalar = ["nok"];      // mumkin emas: o'zgaruvchiga yangi massiv
console.log(mevalar);

Konsolda xato chiqdi: Assignment to constant variable — «o'zgarmas o'zgaruvchiga qiymat berish». Xatodan keyingi qator bajarilmadi.

const — qutiga yopishtirilgan nom yorlig'i. Yorliqni boshqa qutiga ko'chirib bo'lmaydi, lekin qutining ichiga narsa solish yoki undan olish mumkin.

Massiv va obyektlarni odatda const bilan e'lon qiling. let faqat o'zgaruvchining o'ziga yangi qiymat berish kerak bo'lganda (masalan, yigindi kabi hisoblagichlar uchun) kerak.

Obyekt — xususiyatlari bor narsa

Massiv bir xil narsalar ro'yxati uchun qulay. Lekin bitta narsaning turli xususiyatlarini saqlash kerak bo'lsa-chi? Masalan, talabaning ismi, yoshi, shahri va kursi. Buning uchun obyekt (inglizcha object) ishlatiladi.

ID-kartangizga qarang: unda ma'lumotlar «nomi: qiymati» ko'rinishida yozilgan — «Familiya: Karimova», «Ism: Aziza», «Tug'ilgan sana: …». Obyekt ham xuddi shunday: unda kalit (inglizcha key) va qiymat (value) juftliklari saqlanadi. Har bir juftlik xususiyat (property) deyiladi.

talaba obyekti: chap ustunda kalitlar, o'ng ustunda qiymatlar kalit qiymat ism "Aziza" yosh 19 shahar "Samarqand" kurs 2 const talaba = talaba.ism talaba.yosh talaba.shahar talaba.kurs
Obyekt — kalit va qiymat juftliklari to'plami.

Obyekt figurali qavs { } ichida yoziladi. Har bir xususiyat kalit: qiymat ko'rinishida, ular vergul bilan ajratiladi:

const talaba = {
  ism: "Aziza",
  yosh: 19,
  shahar: "Samarqand",
  kurs: 2
};

console.log(talaba);
console.log(talaba.ism);         // nuqta orqali
console.log(talaba["shahar"]);   // kvadrat qavs orqali
console.log(talaba.telefon);     // bunday kalit yo'q

Massivda elementga raqam (indeks) bilan, obyektda esa nom (kalit) bilan murojaat qilinadi. talaba.ism — «talabaning ismi» deb o'qiladi. Mavjud bo'lmagan kalit so'ralsa, massivdagidek undefined qaytadi.

Xususiyatni o'zgartirish va qo'shish

Mavjud kalitga qiymat bersangiz — u o'zgaradi, yangi kalitga bersangiz — yangi xususiyat qo'shiladi:

const kitob = {
  nomi: "Mehrobdan chayon",
  muallif: "Abdulla Qodiriy",
  narx: 45000
};

kitob.narx = 39000;       // o'zgartirish
kitob.janr = "roman";     // yangi xususiyat qo'shish
console.log(kitob);

const kalit = "muallif";
console.log(kitob[kalit]);   // kalit o'zgaruvchida — faqat [ ] bilan
console.log(kitob.kalit);    // undefined: "kalit" degan xususiyat yo'q

console.log(Object.keys(kitob));   // barcha kalitlar massivi

Qachon nuqta, qachon kvadrat qavs? Odatda nuqta yoziladi — u qisqa va o'qishga oson. Kvadrat qavs kalitning nomi o'zgaruvchida saqlanganda kerak: kitob[kalit] «kalit o'zgaruvchisidagi nom bo'yicha» degani, kitob.kalit esa aynan «kalit» degan xususiyatni qidiradi.

Metodlar

Obyekt ichida funksiya ham saqlash mumkin — bunday funksiya metod deyiladi. Metod ichida this so'zi «shu obyekt» degan ma'noni bildiradi:

const hisob = {
  egasi: "Jasur",
  balans: 100000,
  toldir(summa) {
    this.balans = this.balans + summa;
  },
  korsat() {
    console.log(this.egasi + ": " + this.balans + " so'm");
  }
};

hisob.korsat();
hisob.toldir(50000);
hisob.korsat();

Endi siz tanish narsalarni boshqacha ko'ra olasiz: console — obyekt, log esa uning metodi. mevalar.push(…) ham massivning metodini chaqirish. Keyingi darsdagi document ham obyekt bo'ladi.

Obyektlar massivi

Haqiqiy dasturlardagi ma'lumotlarning aksariyati — obyektlar massivi: mahsulotlar, foydalanuvchilar, xabarlar. Har bir element — bitta obyekt, hamma obyektlarda kalitlar bir xil:

const mahsulotlar = [
  { nomi: "Non", narx: 4000 },
  { nomi: "Sut", narx: 12000 },
  { nomi: "Pishloq", narx: 38000 },
  { nomi: "Olma (1 kg)", narx: 15000 },
  { nomi: "Choy", narx: 9000 }
];

console.log(mahsulotlar[1].nomi);   // ikkinchi mahsulotning nomi

// Hammasining jami narxi
let jami = 0;
for (const m of mahsulotlar) {
  jami = jami + m.narx;
}
console.log("Jami:", jami, "so'm");

// 10 000 so'mdan arzonlari
const arzonlar = mahsulotlar.filter((m) => m.narx < 10000);
console.log(arzonlar.map((m) => m.nomi).join(", "));

Qadamma-qadam o'qiymiz:

JSON — ma'lumotni matnga aylantirish

Massiv va obyektlar dastur ishlab turganda xotirada yashaydi. Sahifa yopilsa, ular yo'qoladi. Ularni saqlash yoki serverga yuborish uchun matn ko'rinishiga keltirish kerak. Buning uchun JSON (JavaScript Object Notation — «JavaScript obyekt yozuvi») formati ishlatiladi:

const vazifa = { matn: "Kitob o'qish", bajarildi: false };

const satr = JSON.stringify(vazifa);
console.log(satr);
console.log(typeof satr);          // string — oddiy matn

const qayta = JSON.parse(satr);
console.log(qayta.matn);
console.log(typeof qayta);         // object — yana obyekt

const royxat = [vazifa, { matn: "Sport", bajarildi: true }];
console.log(JSON.stringify(royxat));

JSON matni JavaScript kodiga juda o'xshaydi, faqat kalitlar ham qo'shtirnoqda yoziladi va doim qo'shtirnoq " ishlatiladi. Brauzerning localStorage xotirasi faqat matn saqlay oladi, shuning uchun 18-darsdagi loyihada vazifalar ro'yxatini aynan shu usulda saqlaymiz.

Python'ni bilsangiz. Massiv — Python'dagi ro'yxat (list), obyekt esa lug'at (dict) bilan deyarli bir xil.

PythonJavaScript
len(r)r.length
r.append(x)r.push(x)
x in rr.includes(x)
for x in r:for (const x of r) { … }
[x * 2 for x in r]r.map((x) => x * 2)
d["ism"]d.ism yoki d["ism"]
json.dumps(d) / json.loads(s)JSON.stringify(d) / JSON.parse(s)

Mashqlar

1-mashq Haftalik harorat

Massivda bir haftalik havo harorati berilgan. Ikki qator chiqaring: birinchi qatorda o'rtacha haroratni, ikkinchisida o'rtachadan issiq bo'lgan kunlar sonini. Kutilgan natija: 22 va 3.

const haroratlar = [18, 21, 25, 24, 19, 22, 25];

// 1) O'rtacha haroratni hisoblang va chiqaring

// 2) O'rtachadan issiq kunlar sonini chiqaring
Ishora

O'rtacha = yig'indi / elementlar soni. Issiq kunlar uchun filter((h) => h > ortacha) yozib, natijaning length ini chiqaring.

Yechimni ko'rish
const haroratlar = [18, 21, 25, 24, 19, 22, 25];

let yigindi = 0;
for (const h of haroratlar) {
  yigindi = yigindi + h;
}
const ortacha = yigindi / haroratlar.length;
console.log(ortacha);

const issiqKunlar = haroratlar.filter((h) => h > ortacha);
console.log(issiqKunlar.length);

2-mashq Uzun so'zlar

Massivdagi so'zlardan nechtasi n ta harfdan uzun ekanini sanang va sonni chiqaring. Satrning uzunligi ham length bilan topiladi: "olma".length — 4.

const sozlar = ["kitob", "dastur", "olma", "kompyuter",
                "uy", "maktab", "JavaScript"];
const n = 5;

// n tadan uzun so'zlar sonini chiqaring
Ishora

Hisoblagich oching: let soni = 0;. Har bir so'z uchun if (soz.length > n) bo'lsa, hisoblagichni bittaga oshiring. Yoki qisqasi: sozlar.filter(…).length.

Yechimni ko'rish
const sozlar = ["kitob", "dastur", "olma", "kompyuter",
                "uy", "maktab", "JavaScript"];
const n = 5;

let soni = 0;
for (const soz of sozlar) {
  if (soz.length > n) {
    soni++;
  }
}
console.log(soni);

// Qisqa usul: console.log(sozlar.filter((s) => s.length > n).length);

E'tibor bering: "kitob" roppa-rosa 5 harf, u 5 dan uzun emas, shuning uchun sanalmaydi.

3-mashq Savatning jami narxi

Savatda har bir mahsulotning narxi va soni bor. Har bir mahsulot uchun narx * soni ni hisoblab, hammasini qo'shing va Jami: 65000 so'm ko'rinishida chiqaring.

const savat = [
  { nomi: "Non", narx: 4000, soni: 2 },
  { nomi: "Sut", narx: 12000, soni: 1 },
  { nomi: "Olma", narx: 15000, soni: 3 }
];

// Jami narxni hisoblang
Yechimni ko'rish
const savat = [
  { nomi: "Non", narx: 4000, soni: 2 },
  { nomi: "Sut", narx: 12000, soni: 1 },
  { nomi: "Olma", narx: 15000, soni: 3 }
];

let jami = 0;
for (const m of savat) {
  jami = jami + m.narx * m.soni;
}
console.log("Jami: " + jami + " so'm");

4-mashq Eng qimmat mahsulot

Ro'yxatdagi eng qimmat mahsulotni toping va Eng qimmati: … ko'rinishida uning nomini chiqaring. Kod ro'yxatga yangi mahsulot qo'shilganda ham to'g'ri ishlashi kerak.

const mahsulotlar = [
  { nomi: "Choynak", narx: 180000 },
  { nomi: "Muzlatkich", narx: 5200000 },
  { nomi: "Dazmol", narx: 350000 },
  { nomi: "Televizor", narx: 4100000 }
];

// Eng qimmat mahsulotni toping
Ishora

Avval birinchi mahsulotni «eng qimmat» deb oling: let eng = mahsulotlar[0];. Keyin har bir mahsulotni u bilan solishtiring: narxi kattaroq bo'lsa, eng ni shu mahsulot bilan almashtiring.

Yechimni ko'rish
const mahsulotlar = [
  { nomi: "Choynak", narx: 180000 },
  { nomi: "Muzlatkich", narx: 5200000 },
  { nomi: "Dazmol", narx: 350000 },
  { nomi: "Televizor", narx: 4100000 }
];

let eng = mahsulotlar[0];
for (const m of mahsulotlar) {
  if (m.narx > eng.narx) {
    eng = m;
  }
}
console.log("Eng qimmati: " + eng.nomi);

O'zingizni sinang

const r = [10, 20, 30]; bo'lsa, r[1] nimaga teng?

  1. 10
  2. 20
  3. 30
  4. undefined

To'g'ri. Indekslar 0 dan boshlanadi: r[0] — 10, r[1] — 20.

Massiv oxiriga yangi element qaysi metod bilan qo'shiladi?

  1. shift()
  2. unshift()
  3. pop()
  4. push()

To'g'ri. push oxiriga qo'shadi, pop oxiridan oladi; unshift va shift esa boshi bilan ishlaydi.

[3, 8, 1, 9].filter((x) => x > 5) nima qaytaradi?

  1. [8, 9]
  2. [3, 1]
  3. [false, true, false, true]
  4. 2

To'g'ri. filter shart true bo'lgan elementlarning o'zini qoldiradi va yangi massiv qaytaradi.

const tovar = { nomi: "Choy", narx: 9000 }; obyektidan narxni qanday olamiz?

  1. tovar(narx)
  2. tovar[1]
  3. tovar.narx
  4. narx.tovar

To'g'ri. Obyekt xususiyatiga nuqta bilan murojaat qilinadi: tovar.narx (yoki tovar["narx"]).

JSON.stringify(obyekt) nima qiladi?

  1. Obyektni o'chirib yuboradi
  2. Obyektni JSON ko'rinishidagi matnga aylantiradi
  3. Matndan obyekt yasaydi
  4. Obyektni konsolga chiqaradi

To'g'ri. Teskarisini — matndan obyekt yasashni — JSON.parse bajaradi.

Xulosa

  • Massiv — tartibli qiymatlar ro'yxati: [1, 2, 3]. Indekslar 0 dan boshlanadi, elementlar soni — length.
  • push/pop oxiri bilan, unshift/shift boshi bilan ishlaydi; includes, indexOf, join, slice — qidirish va nusxalash uchun.
  • Aylanish: for (indeks bilan), for...of (har bir element), forEach (har bir element uchun funksiya).
  • map har bir elementni o'zgartiradi, filter keraklilarini tanlaydi; ikkalasi ham yangi massiv qaytaradi.
  • Obyekt — kalit va qiymat juftliklari: { ism: "Aziza", yosh: 19 }. Murojaat: obyekt.kalit yoki obyekt["kalit"].
  • const massiv yoki obyektning ichini o'zgartirishga ruxsat beradi, lekin o'zgaruvchiga yangi qiymat berishni taqiqlaydi.
  • JSON: JSON.stringify — obyektdan matn, JSON.parse — matndan obyekt.