Ma'lumot turlari

Iteratsiyalanuvchi obyektlar (iterable)

Iteratsiyalanuvchi (iterable) obyektlar โ€” massiv tushunchasining umumlashtirilgan ko'rinishi. Bu for..of siklida ishlatib bo'ladigan har qanday obyekt. Massivlar, satrlar va boshqa ko'p tuzilmalar iterable hisoblanadi.

Muammo: o'z obyektimizni iterable qilish

Aytaylik, bizda massiv emas, oddiy obyekt bor, lekin uni for..of bilan aylanib chiqmoqchimiz. Masalan, from dan to gacha sonlar diapazoni:

let range = {
  from: 1,
  to: 5
};

// biz shuni istaymiz:
// for (let num of range) ... 1, 2, 3, 4, 5

Buni ishlashi uchun obyektga maxsus metod โ€” Symbol.iterator qo'shishimiz kerak.

Symbol.iterator

Symbol.iterator โ€” maxsus o'rnatilgan simvol. U obyektning iteratsiyasini boshqaradigan metod nomi bo'lib xizmat qiladi. Ushbu metod iterator deb ataladigan obyekt qaytarishi kerak โ€” unda next() metodi bo'ladi.

next() chaqirilganda { value: ..., done: ... } ko'rinishidagi obyekt qaytaradi. done: false โ€” iteratsiya davom etadi, done: true โ€” tugadi.

iterator.js
// natija shu yerda chiqadi
Bu yerda vazifalar taqsimlanganiga e'tibor bering: range obyektining o'zida next yo'q. Uning o'rniga Symbol.iterator chaqiruvi bilan alohida iterator obyekt yaratiladi va aynan u iteratsiyani boshqaradi. Shu tufayli bir obyekt bo'yicha bir vaqtda bir nechta mustaqil for..of ishlashi mumkin.

for..of aslida qanday ishlaydi?

for (let x of obj) ishga tushganda quyidagilar sodir bo'ladi:

  1. obj[Symbol.iterator]() bir marta chaqiriladi โ€” u iterator obyektni qaytaradi (bo'lmasa xatolik).
  2. Keyin har bir qadamda iteratorning next() metodi chaqiriladi.
  3. next() qaytargan natijaning value qiymati x ga yoziladi.
  4. Agar done: true bo'lsa, sikl to'xtaydi. Aks holda value ishlatiladi va keyingi next() chaqiriladi.

Iteratorni qo'lda ham chaqirsak bo'ladi, bu jarayonni oydinlashtiradi:

manual-iter.js
// natija shu yerda chiqadi

String ham iterable

Massivlar va satrlar โ€” eng ko'p ishlatiladigan o'rnatilgan iterable'lar. for..of satr bo'yicha harfma-harf yuradi va u surrogat juftliklar (masalan, ba'zi emoji va maxsus belgilar) bilan ham to'g'ri ishlaydi.

string-iter.js
// natija shu yerda chiqadi

Array.from โ€” har qanday iterable'ni massivga aylantirish

Global metod Array.from(obj) iterable yoki massivsimon obyektni oladi va undan haqiqiy massiv yasaydi. Shundan so'ng unda barcha massiv metodlarini ishlatish mumkin.

array-from.js
// natija shu yerda chiqadi

Array.from ixtiyoriy ikkinchi argument โ€” map funksiyasini oladi. Har bir element massivga qo'shilishdan oldin shu funksiyadan o'tadi:

array-from-map.js
// natija shu yerda chiqadi
Massivsimon (array-like) obyekt โ€” bu indeks (0, 1, 2...) va length xususiyatiga ega, lekin Symbol.iterator ga ega bo'lmagan obyekt. Array.from ham iterable, ham massivsimon obyektlar bilan ishlaydi โ€” bu uning katta afzalligi.
array-like.js
// natija shu yerda chiqadi
Satrni harflar massiviga aylantirishning eng ishonchli usuli โ€” Array.from(str). U str.split('') dan farqli o'laroq murakkab Unicode belgilarni ham to'g'ri ajratadi.

Xulosa