Massiv metodlari
Massivlar ko'p metodlarni taqdim etadi. Ishni osonlashtirish uchun, ushbu bo'limda ular guruhlarga ajratilgan.
Elementlarni qo'shish/olish
Avval biz oxiridan yoki boshidan elementlarni qo'shish yoki olish metodlarini bilamiz:
arr.push(...items)
– elementlarni oxiriga qo'shadi,arr.pop()
– oxiridan elementni olib tashlaydi,arr.shift()
– boshidan elementni olib tashlaydi,arr.unshift(...items)
– boshiga elementlarni qo'shadi.
Mana bir necha boshqalar.
splice
Massivdan elementni qanday olib tashlash mumkin?
Massivlar ob'ektlar bo'lgani uchun, delete
ishlatishga harakat qilamiz:
Element olib tashlandi, lekin massivning uzunligi hali ham 3 bo'lib qoladi. Bu tabiiy, chunki delete obj.key
qiymatni faqat kalit bo'yicha olib tashlaydi. Bu ob'ektlar uchun yaxshi. Lekin massivlarda biz odatda qolgan elementlarning bo'sh joyni egallashini kutamiz. Biz endi qisqaroq massivga ega bo'lishimizni kutamiz.
Shuning uchun, maxsus metodlar ishlatilishi kerak.
arr.splice
metodi massivlar uchun Shveytsariya armiyasi pichog'i sifatida ishlaydi. U hamma narsani bajarishi mumkin: elementlarni qo'shish, olib tashlash va almashtirish.
Sintaksisi:
Bu arr
ni start
indeksidan boshlab o'zgartiradi: deleteCount
elementlarni olib tashlaydi va keyin elem1
, ..., elemN
ni ularning o'rnida qo'shadi. Olib tashlangan elementlar massivini qaytaradi.
Bu metodni misollar bilan tushunish oson.
Boshlaymiz olib tashlashdan:
Oshkor, to'g'rimi? Indeks 1dan boshlab 1 elementni olib tashladi.
Keyingi misolda, 3 elementni olib tashlab, ularni boshqa ikkita bilan almashtiramiz:
splice
olib tashlangan elementlarning massivini qaytaradi:
splice
elementlarni olib tashlamasdan qo'shish imkonini ham beradi. Buning uchun deleteCount
ni 0 ga qo'ying:
Salbiy indekslar ruxsat etiladi
Bu va boshqa massiv metodlarida salbiy indekslar ruxsat etiladi. Ular massivning oxiridan pozitsiyani belgilaydi, masalan:
slice
arr.slice
metodi arr.splice
ga qaraganda ancha oddiyroq.
Sintaksisi:
Bu yangi massiv qaytaradi, unda start
dan end
gacha (lekin end
ni o'z ichiga olmaydi) bo'lgan barcha elementlarni nusxalaydi. Har ikkala start
va end
salbiy bo'lishi mumkin, bu holda oxirdan pozitsiya qabul qilinadi.
Bu satr metodiga o'xshaydi, ammo substratlar o'rniga submassivlar yaratadi.
Masalan:
Agar argumentlarsiz chaqirsak, arr.slice()
arr
ning nusxasini yaratadi. Bu ko'pincha asliy massivi ta'sir qilmaydigan qo'shimcha transformatsiyalar uchun nusxa olish uchun ishlatiladi.
concat
arr.concat
metodi yangi massiv yaratadi, unda boshqa massivlar va qo'shimcha elementlar mavjud bo'ladi.
Sintaksisi:
Har qanday sonli argumentlarni qabul qiladi – yoki massivlar yoki qiymatlar.
Natija, arr
dan, keyin esa arg1
, arg2
va hokazo elementlarni o'z ichiga olgan yangi massivdir.
Agar argument argN
massiv bo'lsa, undagi barcha elementlar nusxalanadi. Aks holda, argument o'zi nusxalanadi.
Masalan:
Odatda, u faqat massivlardan elementlarni nusxalaydi. Boshqa ob'ektlar, hatto ular massivlarga o'xshasa ham, butunlay qo'shiladi:
...Lekin agar massivga o'xshash ob'ekt Symbol.isConcatSpreadable
xususiyatiga ega bo'lsa, unda u concat
tomonidan massiv sifatida qabul qilinadi: uning elementlari qo'shiladi:
Iteratsiya: forEach
arr.forEach
metodi har bir massiv elementi uchun funktsiyani bajarishga imkon beradi.
Sintaksisi:
Masalan, bu massivning har bir elementini ko'rsatadi:
Va bu kodning maqsadi, elementlarning maqsad massivdagi pozitsiyasini ko'rsatadi:
Funktsiyaning natijasi (agar mavjud bo'lsa) chiqariladi va e'tiborsiz qoldiriladi.
Massivni qidirish
Endi massivda qidirish metodlarini ko'rib chiqamiz.
indexOf/lastIndexOf
indexOf
va lastIndexOf
metodlari massivda biror elementning indeksini topadi.
Sintaksisi:
indexOf
birinchi ko'rinishning indeksini qaytaradi, lastIndexOf
esa oxirgi ko'rinishning indeksini qaytaradi. Agar kerakli element mavjud bo'lmasa, -1 qaytariladi.
Ularning ikkalasi ham ikkinchi argument sifatida qidirishni boshlash uchun indeksni qabul qiladi.
includes
arr.includes
metodi true
yoki false
qaytaradi, agar massiv elementni o'z ichiga olsa yoki bo'lmasa.
Sintaksisi:
Agar kerakli qiymat mavjud bo'lsa, true
qaytariladi, aks holda false
.
find/findIndex
arr.find
metodi massivdagi birinchi elementni qaytaradi, u berilgan shartlarga mos keladi.
Sintaksisi:
find
birinchi mos keladigan elementni qaytaradi yoki undefined
agar element topilmasa.
Masalan:
findIndex
esa shartlarga mos keladigan elementning indeksini qaytaradi.
sort
arr.sort
metodi massiv elementlarini saralash uchun ishlatiladi.
Sintaksisi:
Agar compareFunction
bo'lsa, elementlar shu funksiyaning natijalariga ko'ra saralanadi. Agar compareFunction
bo'lmasa, sort
elementlarni ko'rsatish tartibida (string sifatida) saralaydi.
Misol:
Chunki sort
metodining default tartibi string
sifatida saralaydi. Bu tartibni o'zgartirish uchun maxsus solishtirish funksiyasini ishlatish kerak.
Masalan:
reverse
arr.reverse
metodi massivning tartibini teskari qiladi.
Sintaksisi:
Masalan:
fill
arr.fill
metodi massivdagi barcha elementlarni ma'lum qiymat bilan to'ldiradi.
Sintaksisi:
Massivning start
indeksidan end
indeksigacha (lekin end
ni o'z ichiga olmaydi) barcha elementlarni value
qiymati bilan to'ldiradi.
Masalan:
copyWithin
arr.copyWithin
metodi massivdagi elementlarni boshqa joyga nusxalaydi.
Sintaksisi:
target
indeksiga start
indeksidan boshlab end
indeksigacha (lekin end
ni o'z ichiga olmaydi) barcha elementlarni nusxalaydi.
Misol:
split va join
Haqiqiy hayotdan bir misol. Biz xabarlar ilovasini yozmoqdamiz, va foydalanuvchi vergul bilan ajratilgan qabul qiluvchilar ro‘yxatini kiritadi: John, Pete, Mary. Lekin biz uchun bu yagona satrdan ko‘ra nomlar array'i qulayroq bo‘lar edi. Buni qanday olish mumkin?
str.split(delim)
metodi buni amalga oshiradi. U satrni berilgan ajratuvchi delim bo‘yicha array'ga ajratadi.
Quyidagi misolda biz vergul va bo‘shliq orqali ajratamiz:
split
metodining ikkinchi ixtiyoriy sonli argumenti mavjud – array uzunligiga cheklov qo‘yish uchun. Agar berilsa, ortiqcha elementlar e'tiborga olinmaydi. Amaliyotda bu kamdan-kam qo‘llaniladi:
Harflarga ajratish
Bo‘sh qiymat bilan split(s)
chaqiruvi satrni harflarga ajratadi:
join
arr.join(glue)
metodi esa split
ga teskari amalni bajaradi. U arr
elementlarini qayta stringga aylantiradi va ular orasiga glue qo‘yadi.
Misol uchun:
reduce/reduceRight
Agar bizga array'ni aylantirib chiqish kerak bo‘lsa – forEach
, for
yoki for..of
dan foydalanishimiz mumkin.
Agar bizga har bir element uchun ma'lumotlarni qaytarish kerak bo‘lsa – map
dan foydalanishimiz mumkin.
arr.reduce
va arr.reduceRight
metodlari ham shu turkumga kiradi, lekin biroz murakkabroq. Ular array asosida bitta qiymatni hisoblash uchun ishlatiladi.
Sintaksisi:
Funksiya barcha array elementlariga ketma-ket qo‘llanadi va oldingi qo‘ng‘iroq natijasini keyingisiga o‘tkazadi.
Argumentlar:
accumulator
– oldingi funksiya chaqiruvining natijasi, birinchi chaqiruvdainitial
ga teng (agarinitial
berilgan bo‘lsa).item
– hozirgi array elementi.index
– uning pozitsiyasi.array
– array o‘zi.
Funksiya qo‘llanilganda, oldingi funksiya chaqiruvi natijasi keyingisiga birinchi argument sifatida o‘tadi. Shunday qilib, birinchi argument aslida barcha oldingi bajaruvlarning birlashtirilgan natijasini saqlaydigan to‘plovchi hisoblanadi. Va oxirida u reduce
ning natijasiga aylanadi.
Misol yordamida buni osonroq tushunish mumkin.
Bu yerda biz array yig‘indisini bir qatorli kodda olamiz:
Funksiya chaqiruvida faqat 2 argument ishlatilgan, bu odatda yetarli.
Batafsil ko‘rib chiqamiz.
- Birinchi chaqiruvda
sum
boshlang‘ich qiymat (ya'ni reduce oxirgi argumenti), 0 ga teng, vacurrent
birinchi array elementiga teng, ya'ni 1. Shunday qilib, funksiya natijasi 1. - Ikkinchi chaqiruvda,
sum
= 1, biz unga ikkinchi array elementini (2) qo‘shamiz va qaytaramiz. - Uchinchi chaqiruvda,
sum
= 3 va yana bir element qo‘shamiz, va hokazo…
Biz hisoblash jarayonini jadvalda ham ko‘rishimiz mumkin:
sum | current | result |
---|---|---|
1-chaqiruv | 0 | 1 |
2-chaqiruv | 1 | 3 |
3-chaqiruv | 3 | 6 |
4-chaqiruv | 6 | 10 |
5-chaqiruv | 10 | 15 |
Shunday qilib, oldingi chaqiruvning natijasi keyingi chaqiruvning birinchi argumentiga aylanadi.
reduceRight
xuddi shu tarzda ishlaydi, lekin o‘ngdan chapga qarab hisoblaydi.
Bu yerda biz oldingi chaqiruv natijasi keyingi chaqiruvning birinchi argumentiga aylanishini aniq ko'rishimiz mumkin.
Biz dastlabki qiymatni e'tiborsiz qoldirishimiz ham mumkin:
Natija o'sha. Chunki agar dastlabki qiymat mavjud bo'lmasa, reduce
massivning birinchi elementini dastlabki qiymat sifatida qabul qiladi va iteratsiyani ikkinchi elementdan boshlaydi.
Hisoblash jadvali yuqoridagidek, birinchi qatorni chiqarib tashlagan holda.
Ammo bunday foydalanishda katta ehtiyotkorlik talab qilinadi. Agar massiv bo'sh bo'lsa, dastlabki qiymatsiz reduce
chaqiruvi xatoga olib keladi.
Mana bir misol:
Shuning uchun har doim dastlabki qiymatni ko'rsatish tavsiya etiladi.
arr.reduceRight
usuli ham xuddi shunday qiladi, lekin chapdan o'ngga qarab yuradi.
Array.isArray
Massivlar alohida til turi hosil qilmaydi. Ular obyektlar asosida tuzilgan.
Shunday qilib, typeof
oddiy obyektni massivdan ajratishga yordam bermaydi:
...Ammo massivlar juda ko'p ishlatilgani uchun buni aniqlash uchun maxsus usul mavjud: Array.isArray(value)
. U qiymat massiv ekanligini qaytaradi, aks holda false qaytaradi.
Ko'p usullar "thisArg"ni qo‘llab-quvvatlaydi
Deyarli barcha massiv usullari funksiyalarni chaqiradi – masalan, find
, filter
, map
, ammo sezilarli istisno bu sort
. Ular ixtiyoriy qo‘shimcha parametr thisArg
ni qabul qiladi.
Bu parametr yuqoridagi bo‘limlarda tushuntirilmagan, chunki u kamdan-kam hollarda ishlatiladi. Ammo to'liq bo'lish uchun biz uni yoritishimiz kerak.
Mana bu usullarning to'liq sintaksisi:
thisArg
parametri funksiyada this
ga aylanadi.
Misol uchun, biz armiyaning obyektining usulini filtr sifatida ishlatamiz va thisArg
kontekstni uzatadi:
Agar yuqoridagi misolda biz users.filter(army.canJoin)
dan foydalangan bo'lsak, unda army.canJoin
mustaqil funksiya sifatida chaqiriladi, this=undefined
bilan, bu esa darhol xatoga olib keladi.
users.filter(army.canJoin, army)
chaqiruvi users.filter(user => army.canJoin(user))
bilan almashtirilishi mumkin, bu xuddi shunday ishlaydi. Ikkinchisi odatda ko'proq ishlatiladi, chunki bu ko'pchilik uchun tushunarliroq.
Xulosa
Massiv usullarining qo‘llanma varaqasi:
Elementlarni qo'shish/o'chirish uchun:
push(...items)
– elementlarni oxiriga qo'shadi,pop()
– elementni oxiridan chiqaradi,shift()
– elementni boshidan chiqaradi,unshift(...items)
– elementlarni boshiga qo'shadi.splice(pos, deleteCount, ...items)
– indekspos
dadeleteCount
elementni o'chiradi vaitems
ni kiritadi.slice(start, end)
– yangi massiv yaratadi,start
indeksidanend
gacha (shu jumladan emas) elementlarni nusxalaydi.concat(...items)
– yangi massiv qaytaradi: joriy massivning barcha elementlarini nusxalaydi vaitems
ni unga qo'shadi. Agaritems
dan biri massiv bo'lsa, uning elementlari olinadi.
Elementlar orasida qidirish uchun:
indexOf/lastIndexOf(item, pos)
–pos
dan boshlab elementni qidiring va indeksni qaytaring yoki topilmasa -1.includes(value)
– massivdavalue
mavjud bo'lsa, true, aks holda false qaytaradi.find/filter(func)
– funktsiya orqali elementlarni filtrlaydi, true qaytaradigan birinchi yoki barcha qiymatlarni qaytaradi.findIndex
xuddifind
kabi, lekin qiymat o'rniga indeksni qaytaradi.
Elementlarni takrorlash uchun:
forEach(func)
– har bir element uchunfunc
ni chaqiradi, hech narsa qaytarmaydi.
Massivni o'zgartirish uchun:
map(func)
– har bir element uchunfunc
ni chaqirib, natijadan yangi massiv yaratadi.sort(func)
– massivni o‘z joyida saralaydi va uni qaytaradi.reverse()
– massivni o‘z joyida teskari aylantiradi va uni qaytaradi.split/join
– qatorni massivga aylantiradi va aksincha.reduce/reduceRight(func, initial)
– massiv bo'ylab yagona qiymatni hisoblaydi, har bir element uchunfunc
ni chaqiradi va chaqiruvlar orasida oraliq natijani uzatadi.
Qo‘shimcha:
Array.isArray(value)
qiymat massiv ekanligini tekshiradi, agar shunday bo'lsa true, aks holda false qaytaradi.
Diqqat qiling, sort
, reverse
va splice
usullari massivning o‘zini o‘zgartiradi.
Bu usullar eng ko‘p ishlatiladiganlari bo‘lib, ular 99% foydalanish holatlarini qamrab oladi. Ammo bir nechta boshqalar ham mavjud:
arr.some(fn)
/arr.every(fn)
massivni tekshiradi.
Funktsiya fn
xuddi map
kabi massivning har bir elementi uchun chaqiriladi. Agar natijalardan biri/barchasi true bo‘lsa, true qaytaradi, aks holda false.
Ushbu usullar || va && operatorlariga o'xshash ishlaydi: agar fn
some()
chaqirilganida haqiqiy qiymat qaytarsa, arr.some()
darhol true qaytaradi va qolgan elementlarni tekshirishni to'xtatadi; agar fn
every()
da yolg'on qiymat qaytarsa, arr.every()
darhol false qaytaradi va qolgan elementlarni tekshirishni to'xtatadi.
Biz every
yordamida massivlarni solishtirishimiz mumkin:
-
arr.fill(value, start, end)
– massivnistart
danend
gacha bo'lgan indekslar orasida takrorlanuvchi qiymat bilan to'ldiradi. -
arr.copyWithin(target, start, end)
–start
danend
gacha bo'lgan elementlarni o'zida,target
pozitsiyasida nusxalaydi (mavjudlarini o'zgartiradi). -
arr.flat(depth)/arr.flatMap(fn)
– ko'p o'lchovli massivdan tekis massiv yaratadi.
To‘liq ro‘yxat uchun qo‘llanmaga qarang.
Dastlab, juda ko'p usullar bor kabi tuyulishi mumkin, ular yodda saqlash qiyin. Ammo aslida bu juda oson.
Qo‘llanmani ko‘rib chiqing, shunda ular bilan tanish bo‘lasiz. Keyin ushbu bobdagi vazifalarni yeching, shunda massiv usullari bilan tajribaga ega bo'lasiz.
Keyinchalik, agar siz massiv bilan biror narsa qilishni xohlasangiz va qanday qilishni bilmasangiz – bu yerga keling, qo‘llanmaga qarang va to‘g‘ri usulni toping. Misollar sizga to'g'ri yozishga yordam beradi. Tez orada siz usullarni avtomatik ravishda eslay olasiz, hech qanday maxsus harakatlarsiz.