Iterables
...
Iterables
Iterable obyektlar — bu massivlarning umumiylashtirilgan tushunchasi bo‘lib, bu konsept har qanday obyektni for..of siklida ishlatiladigan qiladigan usuldir.
Albatta, massivlar iterable sanaladi. Ammo ko‘plab boshqa o‘rnatilgan obyektlar ham iterable. Masalan, satrlar ham iterable hisoblanadi.
Agar obyekt texnik jihatdan massiv bo‘lmasa, ammo nimaningdir to‘plami (list, set) ko‘rinishida bo‘lsa, for..of sikli orqali uni iteratsiya qilish mumkin. Keling, bu qanday ishlashini ko‘rib chiqaylik.
Symbol.iterator
Iterables tushunchasini tushunib olish uchun o‘zimiz birini yaratib ko‘ramiz.
Masalan, bizda massiv emas, lekin for..of uchun mos ko‘rinadigan obyekt mavjud, masalan, raqamlar oralig‘ini ifodalovchi obyekt:
for..of ishlashi uchun range obyektini iterable qilish kerak, buning uchun Symbol.iterator deb nomlangan maxsus metod qo‘shamiz.
for..of boshlanganda ushbu metodni bir marta chaqiradi (topilmasa xatolik yuz beradi). Bu metod iteratorni qaytarishi kerak – u next metodiga ega obyekt bo‘lishi kerak. Keyinchalik for..of faqat shu qaytarilgan obyekt bilan ishlaydi.
for..of yangi qiymat so‘raganda, bu obyektdan next() metodini chaqiradi.
next() ning natijasi {done: Boolean, value: any} ko‘rinishida bo‘lishi kerak, bu yerda done=true bo‘lsa, iteratsiya tugagan bo‘ladi, aks holda value keyingi qiymat hisoblanadi.
Mana range ning to‘liq kodiga sharhlar bilan birga qaraymiz:
E’tibor bering, iterablelarning asosiy xususiyati — vazifalarni ajratish.
range ning o‘zi next() metodiga ega emas. Aksincha, range[Symbol.iterator]() chaqirilganda boshqa bir obyekt yaratiladi, bu obyekt iteratsiya uchun qiymatlar yaratadi.
Iterator obyekti iteratsiya qilinayotgan obyekt bilan alohida hisoblanadi.
Texnik jihatdan ularni birlashtirishimiz va kodni sodda qilish uchun range ni o‘zini iterator sifatida ishlatishimiz mumkin:
Endi range[Symbol.iterator]() metodi range obyektini o‘zini qaytaradi. U kerakli next() metodiga ega va iteratsiya jarayonini this.current da saqlab boradi. Bu qisqa, ammo ba’zan bu yaxshi.
Kamchiligi shundaki, endi bir vaqtda ikki xil for..of siklini ishga tushirish imkonsiz, chunki faqat bitta iterator mavjud – bu obyektning o‘zi. Ammo bitta obyektni bir vaqtda ikki xil sikl bilan iteratsiya qilish juda kam holatda kerak bo‘ladi, hattoki asinxron holatlarda ham.
Cheksiz iteratsiyalar
Cheksiz iteratsiyalar ham mumkin. Masalan, range.to = Infinity bo‘lsa, range cheksiz bo‘ladi. Yoki cheksiz tasodifiy raqamlar ketma-ketligini yaratadigan obyekt qilishingiz mumkin.
Albatta, bunday obyekt ustida for..of sikli cheksiz bo‘ladi. Ammo biz uni break orqali to‘xtatishimiz mumkin.
Satrlar iterable
Massivlar va satrlar o‘rnatilgan iterable obyektlardir.
Masalan, satrda for..of har bir belgi ustida ishlaydi:
Iteratsiyani qo‘lda chaqirish
Iteratsiyani to‘g‘ridan-to‘g‘ri for..of yordamida emas, balki qo‘lda boshqarish ham mumkin. Masalan:
Bu kamdan-kam hollarda kerak bo‘ladi, lekin jarayon ustidan to‘liq nazoratni olish uchun foydali.
Iterable va array-likes
Iterables — bu Symbol.iterator metodini amalga oshiruvchi obyektlar. Array-likes esa indekslarga va uzunlikka ega obyektlar bo‘lib, ular massivlarga o‘xshab ko‘rinadi.
Array.from
Array.from metodi iterable yoki array-like obyektlarni massivga aylantirish uchun ishlatiladi.
Misol:
Xulosa
- Iterable obyektlar
for..ofsiklida ishlatilishi mumkin. Array.frommetodi iterable yoki array-like obyektlarni haqiqiy massivga aylantiradi.
Last updated on