Massivlar: takrorlash usullari. Ob'ektlardagi xususiyatlarni takrorlash II

Salom! Oxirgi darsda biz ob'ektlar nima ekanligini va ular nima uchun kerakligini ko'rib chiqdik va bugun biz ob'ektning xususiyatlari bilan qanday ishlashni va bu xususiyatlarning barchasini qanday qilib saralashni ko'rib chiqamiz. Ushbu maqsadlar uchun for..in xususiyat siklidan foydalaniladi (siz JavaScript-da tsikllar haqida o'qishingiz mumkin).

Loop for...in

Sintaksis:

For (objda kalit) ( /* ... obj bilan amallar ... */ )

For..in tsikli obj ob'ektining xossalari bo'ylab ketma-ket takrorlanadi va har bir xususiyat nomini kalitga yozadi.

O'zgaruvchini for tsiklida e'lon qilish (objda var kaliti)

Ushbu tsiklda siz asosiy o'zgaruvchini e'lon qilishingiz mumkin:

For (menyu1dagi var tugmasi) ( // ... )

Ob'ektning xossalari bo'yicha for...in tsikli yordamida takrorlash misolini ko'rib chiqamiz:

Var menyusi = (kengligi: 400, balandligi: 300, sarlavha: "Menyu mening" ); for (menyudagi var tugmasi) ( // bu kod ob'ektning har bir xususiyati uchun ishlaydi // ..va xususiyat nomini va shunga mos ravishda uning qiymatini ko'rsatadi alert("Kalit: " + kalit + " qiymati: " + menyu) )

Sizning e'tiboringizni misolda kvadrat qavs menyusidan foydalanganimizga qaratmoqchiman. Buning sababi shundaki, agar biz xususiyat nomini o'zgaruvchida saqlasak, u holda biz unga faqat kvadrat qavslar orqali kirishimiz mumkin, lekin nuqta orqali emas.

uchun...of

Ob'ektlar va massivlarni kesib o'tish uchun yangi tsikl ham mavjud. Uning sintaksisi for...in sikliga juda o'xshaydi, lekin farqlari shundaki, u massivning kalitlari yoki indekslarini emas, balki uning qiymatlarini chiqaradi. Mana bir misol:

Var menyusi = (kengligi: 400, balandligi: 300, sarlavha: "Menyu mening" ); for (menyuning var tugmasi) ( // bu kod ob'ektning har bir xususiyati uchun ishlaydi // ..va tegishli ravishda xususiyat qiymatini ko'rsatadi alert("value: " + key +","); //400, 300, "Menyu mening")

Ob'ektdagi xususiyatlar soni

Ammo ob'ektdagi xususiyatlar sonini bilishingiz kerak bo'lsa-chi? Buni qanday qilishim mumkin?

Afsuski, bu masala bo'yicha tayyor echimlar mavjud emas.

Eng oson yo'li - xususiyatlarni aylanib chiqish va quyidagi tarzda hisoblash:

Var menyusi = (kengligi: 400, balandligi: 300, sarlavha: "Menyu mening" ); var count = 0; for (menyudagi var tugmasi) ( count++; ) alert("Jami xususiyatlar: " + count);

Natijalar

  • Ob'ektning xususiyatlarini takrorlash uchun kalit siklidan foydalaniladi: for (objdagi kalit).

Vazifalar

Ob'ekt bo'sh yoki yo'qligini aniqlang

IsEmptyObject(obj) funksiyasini yarating, agar ob'ekt hech qanday xususiyatga ega bo'lmasa, true qiymatini qaytaradi va kamida bitta xususiyat mavjud bo'lsa, false qaytaradi.

Bu shunday ishlashi kerak:

Function isEmptyObject(obj) ( /* sizning kodingiz */ ) var obj = (); alert(isEmptyObject(obj)); // haqiqiy obj["8:30"] = "ko'tarilish"; alert(isEmptyObject(obj)); // yolg'on

Ob'ektning barcha xususiyatlarining o'rtacha arifmetik qiymatini hisoblang

Ish haqi bilan ish haqi ob'ekti mavjud. Barcha ish haqining o'rtacha arifmetik qiymatini ko'rsatadigan kodni yozing.
Agar ob'ekt bo'sh bo'lsa, natija 0 bo'lishi kerak.
Masalan.

Bu shunday ishlaydi:

// ECMASCRIPT 2015+ TALAB QILADI var s, myStringArray = ["Salom", "Dunyo"]; for (s of myStringArray) ( // ... s ... bilan biror narsa qiling)

Yoki yaxshisi, chunki ECMAScript 2015 ham let va const bilan bloklangan o'zgaruvchilarni taqdim etadi:

// ECMASCRIPT 2015+ TALAB QILADI const myStringArray = ["Salom", "Dunyo"]; for (const s of myStringArray) ( // ... s bilan biror narsa qilish ... ) // s endi bu yerda aniqlanmagan

Siyrak massivlar haqida eslatma: JavaScript-dagi massiv aslida uzunligida ko'rsatilgandek ko'p elementlarni saqlamasligi mumkin; bu xabar qilingan raqam qiymat saqlanadigan eng yuqori indeksdan bitta kattaroqdir. Agar massivda uning uzunligi ko'rsatilganidan kamroq elementlar bo'lsa, u siyrak deyiladi. Masalan, faqat 3, 12 va 247 indekslardagi elementlarga ega massivga ega bo'lish mutlaqo qonuniydir; Bunday massivning uzunligi 248 ga teng, lekin aslida u faqat 3 ta qiymatni saqlaydi. Agar siz boshqa indeksdagi elementga kirishga harakat qilsangiz, massiv aniqlanmagan qiymatga ega bo'ladi. Shunday qilib, siz massivni “takrorlashni” xohlaganingizda, sizda javob berilishi kerak bo'lgan savol bor: uning uzunligi bo'yicha ko'rsatilgan butun diapazon bo'ylab takrorlashni xohlaysizmi va etishmayotgan elementlar uchun aniqlanmagan jarayonmi yoki faqat ma'lumotlarni qayta ishlashni xohlaysizmi? elementlar aslida mavjudmi? Ikkala yondashuv uchun ham ko'plab ilovalar mavjud; bu faqat massivdan nima uchun foydalanayotganingizga bog'liq.

Agar siz massivni for .. of bilan takrorlasangiz, tsiklning tanasi uzunlik bo‘yicha bajariladi va massivda bo‘lmagan har qanday elementlar uchun tsiklni boshqarish o‘zgaruvchisi aniqlanmagan qilib o‘rnatiladi. "Biror narsa qilish" kodingizning tafsilotlariga qarab, bu xatti-harakat siz xohlagan narsa bo'lishi mumkin, ammo bu siz xohlamagan bo'lsa, boshqa yondashuvdan foydalanishingiz kerak.

Albatta, ba'zi ishlab chiquvchilarda baribir boshqa yondashuvni qo'llashdan boshqa iloji yo'q, chunki ular negadir JavaScript-ning hali ... uchun qo'llab-quvvatlanmaydigan versiyasini nishonga olishmoqda.

Agar JavaScript ilovangiz ECMAScript spetsifikatsiyasining oldingi versiyasiga mos kelsa (masalan, Internet Explorer-ning 9-dan oldingi versiyalari bundan mustasno), siz tsikl o‘rniga Array#forEach iterator usulidan foydalanishingiz mumkin. Bunday holda, siz massivdagi har bir element uchun chaqiriladigan funksiyani topshirasiz:

Var myStringArray = [ "Salom", "Dunyo" ]; myStringArray.forEach(funksiya(lar) ( // ... s ... bilan biror narsa qilish));

dan farqli o'laroq, .forEach faqat qiymatlarni o'z ichiga olgan elementlarda funktsiyani chaqiradi. Agar biz uchta elementli va uzunligi 248 bo'lgan faraziy massivimizni o'tkazsak, u funktsiyani 248 marta emas, balki faqat uch marta chaqiradi. Bundan tashqari, etishmayotgan elementlar va aslida undefined ga o'rnatilgan elementlarni ajratadi; ikkinchisi uchun, u hali ham argument sifatida aniqlanmagan qiymatni berib, funktsiyani chaqiradi. Agar siz siyrak massivlar bilan shunday ishlov berishni istasangiz, tarjimoningiz ... of ni qo'llab-quvvatlasa ham, .forEach bu yo'l bo'lishi mumkin.

JavaScript-ning barcha versiyalarida ishlaydigan oxirgi variant aniq hisoblash tsiklidir. Siz shunchaki uzunlikdan 0 dan birgacha kamroq hisoblaysiz va hisoblagichni indeks sifatida ishlatasiz. Asosiy tsikl quyidagicha ko'rinadi:

Ushbu yondashuvning afzalligi shundaki, siz siyrak massivlarni qanday boshqarishni tanlashingiz mumkin; Yuqoridagi kod sikl tanasini toʻliq uzunlik boʻylab boshqaradi va s ni har qanday etishmayotgan elementlar uchun aniqlanmagan qilib oʻrnatadi, masalan .. of . Buning o'rniga .forEach kabi siyrak massivning faqat mavjud elementlarini qayta ishlashni istasangiz, indeksga oddiy chek qo'shishingiz mumkin:

Var i, s, myStringArray = [ "Salom", "Dunyo" ], len = myStringArray.length; uchun (i=0; i

Lokal oʻzgaruvchiga uzunlik qiymatini belgilash (toʻliq myStringArray.length ifodasini sikl holatiga qoʻshishdan farqli oʻlaroq) unumdorlikka sezilarli taʼsir koʻrsatishi mumkin, chunki u har safar xususiyat qidirishni oxirigacha oʻtkazib yuboradi; Mening mashinamda Rhino-dan foydalanganda tezlik 43% ni tashkil qiladi.

Uzunlikni keshlash tsiklni ishga tushirish bandida amalga oshirilganini ko'rishingiz mumkin, masalan:

Var i, len, myStringArray = [ "Salom", "Dunyo" ]; uchun (len = myStringArray.length, i=0; i

Boshqalar tilga olgan sintaksisdagi for ... ob'ektning xossalari bo'ylab aylanish uchun ishlatiladi; JavaScript-dagi massiv shunchaki raqamli xususiyat nomlari (va avtomatik yangilanadigan uzunlik xususiyati) bo'lgan ob'ekt bo'lgani uchun siz nazariy jihatdan massivni u bilan aylantira olasiz. Ammo muammo shundaki, u raqamli xususiyat qiymatlari bilan cheklanmaydi (esda tutingki, hatto usullar ham haqiqatan ham faqat qiymati yopilish bo'lgan xususiyatlardir) va raqamli tartibda takrorlanishi kafolatlanmaydi. Shuning uchun, sintaksisdagi for ... massivlar bo'ylab aylanish uchun ishlatilmasligi kerak.

2016 yil 12 mart

Zamonaviy JavaScript-da massivlar orqali takrorlash uchun ishlatiladigan "iteratsiya usullari" mavjud. Ushbu qo'llanmada biz quyidagi usullarni ko'rib chiqamiz:

har biriga

uchun .forEach() usuli qo'llaniladi qidirmoq massiv. U qayta qo'ng'iroq qilish deb ataladigan funktsiyani chaqiradi, uning yordamida uchta parametr elementi, i, arr o'tkaziladi, bu erda:

  • element — massiv elementi;
  • i - massivning seriya raqami;
  • arr - takrorlanishi kerak bo'lgan massivning o'zi.

Ushbu usuldan qanday foydalanishni tushunishni osonlashtirish uchun misolni ko'rib chiqing:

Var user=["admin","pass",31]; user.forEach(funksiya(element,i,user)( alert("Element raqamining qiymati " + i + " : " + element); ));

Bu usul muntazam for loop o'rniga ishlatilishi mumkin.

filtr

Filtrlash uchun .filter() usuli qo'llaniladi, u qayta qo'ng'iroq qilish funksiyasidan ham foydalanadi, lekin agar massivdagi elementlar true qiymatiga mos kelsa, yangi massiv yaratadi:

Var arr=; var newArr=arr.filter(funksiya(raqam)( raqamni qaytarish< 0; }); alert(newArr); // выведет -34,-4

Ushbu misolda raqamlar manfiy qiymatlar uchun tekshiriladi va chiqish bu qiymatlarga ega yangi massivdir. Siz o'zingizning shartlaringizni o'ylab topishingiz mumkin, bular raqamlar bo'lishi shart emas.

har bir / ba'zi

Bu ikki usul bir-biriga o'xshash va ikkalasi ham massivni tekshirish uchun ishlatiladi, faqat usul .every() Agar massivdagi barcha qiymatlar belgilangan shartga va usulga mos kelsa, true qiymatini qaytaradi .biroz() Agar shartga kamida bitta qiymat mos kelsa, true qiymatini qaytaradi:

Var arr=; alert(arr.every(funksiya(raqam))(raqamni qaytaring< 0; })); // выведет false

Umid qilamanki, agar yuqoridagi misolda biz ishlatgan bo'lsak qandaydir usul u holda biz noto'g'ri o'rniga true qiymatini ko'rsatgan bo'lardik.

xarita

.map() usuli massivni o'zgartiradi va undan yangisini oladi. Hammasi qayta qo'ng'iroq qilish funktsiyasini chaqirish orqali amalga oshiriladi:

Var arr=; var newArr=arr.map(funksiya(raqam)( raqamni qaytarish*2; )); ogohlantirish (newArr);

Ushbu misolda biz elementlarning qiymati ikki baravar ko'p bo'lgan yangi massivni oldik.

kamaytirish/kamaytirishO'ng

Biz ko'rib chiqadigan oxirgi usullar - qisqartirish va kamaytirish O'ng. Ular oraliq natijani saqlash vaqtida massivning har bir elementini qayta ishlash uchun ishlatiladi. Usul har bir element bo'ylab chapdan o'ngga takrorlanadi, reduceRight esa buning aksini qiladi. Boshqa usullardan farqli o'laroq, qayta qo'ng'iroq qilish funktsiyasidan tashqari, bu erda initialValue argumenti ham ko'rsatilgan - "boshlang'ich qiymat". Bundan tashqari, qayta qo'ng'iroq qilish funktsiyasi "oraliq natija" ni belgilaydi - oldingi qiymat Va joriy element— massivning joriy elementi.

Keling, bir misolni ko'rib chiqaylik:

getSums(arr) funksiyasi ( var result = ; if (!arr.length) natijani qaytaradi; var totalSum = arr.reduceRight(funksiya(sum, element) ( result.push(sum); sum + element; )); natija .push(totalSum) alert(getSums()); // 1,3,6,10,15

Ushbu misolda nima sodir bo'ldi? Biz oldingilar yig'indisidan yaratilgan elementlar bilan yangi massivni olish imkonini beruvchi funksiya yaratdik. Bundan tashqari, elementlarning hisoboti oxiridan keladi. Mana oddiyroq misol, unda men massivdagi elementlar yig‘indisini hisoblaydigan funksiya yaratdim:

getSum(arr) funksiyasi (var natija = arr.reduce(funksiya(summa, joriy) ( summani qaytarish + joriy )); natijani qaytarish; ); ogohlantirish (getSum()); Teglar:

Salom! Biz massiv usullarini o'rganishni davom ettiramiz va bu darsda biz massivni takrorlash usullarini ko'rib chiqamiz. Bu usullar massivni aylanib o'tish va uning elementlarida ma'lum amallarni bajarish imkonini beradi. Ha, men bu usullarning barchasi IE 8 da qo'llab-quvvatlanmasligini aytishni unutib qo'ydim. Garchi hozir ular ushbu brauzer tomonidan qo'llab-quvvatlanmasligi juda muhim bo'lsa-da, lekin baribir, agar siz IE8 qo'llab-quvvatlashini istasangiz, u holda ES5-shim sizga yordam beradi. Va biz davom etamiz

forHar bir usul

Bu usul massivni siklda aylanib o'tish uchun ishlatiladi, lekin siz unga massiv elementlarida ma'lum amallarni bajarishingiz mumkin bo'lgan funksiyani topshirishingiz mumkin. Keling, bir misolni ko'rib chiqaylik.

Var mas = ["Banan", "Avokado", "Sabzi"]; mas.forEach(funksiya(element, i, mas) ( alert(i + ": " + element + " (massiv: " + mas + ")"); ));

Bu erda misolda funksiya forEach usuliga uzatiladi, u 3 ta parametrni belgilaydi:

element- massiv elementi

i— massiv elementi raqami

mas— qayta ishlanayotgan massiv.

Bu usul massivni takrorlash uchun for tsikli o'rniga ishlatilishi mumkin.

filtrlash usuli

Bu usul, forEach usuli kabi, massivni takrorlash uchun ishlatiladi va argument sifatida funktsiya uzatiladi, lekin u massivni filtrlash imkonini beradi va faqat biz o'tadigan funktsiya elementlarini o'z ichiga olgan yangi massivni qaytaradi. bu usulga rost qaytariladi.

Bu biroz chalkash, shuning uchun buni misol bilan ko'rib chiqaylik.

Var mas = ; var pozitivNum = mas.filtr(function(num) ( qaytaruvchi raqam > 0; )); document.write(pozitivNum); // 1,4,3

Misolda raqamlarga ega massiv bor va biz asl massivdan faqat ijobiy raqamlarni o'z ichiga oladigan boshqa massivni olishimiz kerak. Buning uchun massivga filtrlash usulini qo'llaymiz va har bir elementni tekshiradigan funksiyani chaqiramiz, ya'ni u barcha ijobiy raqamlarni qaytaradi va natija boshqa massivda saqlanadi, misolda bu ijobiyNum.

xarita usuli

Xarita usuli boshqa massivni yaratadi, u asl massiv funksiyasini chaqirish natijalaridan iborat bo'ladi, lekin bu funksiyada dastlabki massiv elementlarida ba'zi harakatlar amalga oshiriladi va natija yangi massivda xuddi shunday ko'rinadi. Keling, bir misolni ko'rib chiqaylik, aks holda menimcha, bu mutlaqo tushunarsiz.

Var mas = ; var newMas = mas.map(function(element) (element*element; )); // kvadratlar alert (newMas) bilan massiv oldi; // 1,4,9

Misolda raqamlar bilan boshlang'ich massiv mavjud bo'lib, unga xarita usuli qo'llaniladi, bunda massivning har bir elementi o'ziga ko'paytiriladi va natija boshqa massivga yoziladi. Natijada, biz asl massivdagi raqamlar kvadratlari bilan massivni olamiz.

Har bir / ba'zi usullar

Ushbu usullar massivda element mavjudligini tekshiradi. Ular buni ularga parametr sifatida uzatiladigan funksiya orqali amalga oshiradilar, ya'ni agar bu funksiya "true" bo'lsa, u holda usulning o'zi "true"ga qaytadi. Bundan tashqari, har bir usul har bir element funksiyaning shartiga mos kelishini talab qiladi va ba'zi bir usul kamida bitta mos kelishini talab qiladi. Va har doimgidek, bu erda siz uchun bir misol.

Var mas = ; funktsiya isPositiv(num) ( return num > 0; ) if(mas.every(isPositiv)) ( document.write("Masiv faqat musbat raqamlardan iborat"); ) else( document.write("Masivda kamida bittasi mavjud manfiy raqam "); ) if(mas.some(isPositiv)) ( document.write("Masivda kamida bitta musbat raqam mavjud"); ) else ( document.write("Masivda musbat sonlar yo'q") )

Bir misolni ko'rib chiqing: bizda musbat va manfiy raqamlardan iborat massiv bor va biz uni kamida bitta salbiy raqam mavjudligi uchun tekshirishimiz kerak. Buning uchun biz har bir va ba'zi usullardan foydalanamiz. Biz musbat raqamlarni qaytaradigan funktsiyani yaratamiz va keyin uni har bir usulga o'tkazamiz, chunki bu usul mantiqiy natijani qaytaradi, u shartli bayonotlarda qo'llaniladi. Bizning misolimizdagi har bir usul massivda manfiy sonlar borligi uchun noto'g'ri qiymatni qaytaradi, lekin massivda kamida bitta musbat son bo'lgani uchun ba'zi metodlar rost qaytaradi.

kamaytirish/kamaytirishO'ng

Agar massivni takrorlash kerak bo'lsa, forEach, for yoki for..of dan foydalanishingiz mumkin.

Agar siz massivni takrorlashingiz va har bir element uchun ma'lumotlarni qaytarishingiz kerak bo'lsa, siz xaritadan foydalanasiz.

Usullari arr.reduce Va arr.reduceRight Yuqoridagi usullarga o'xshash, ammo ular biroz murakkabroq. Ular butun massiv asosida bitta qiymatni hisoblash uchun ishlatiladi.

Sintaksis:

Qiymati = arr.reduce(funktsiya (oldingi qiymat, element, indeks, massiv) ( // ... ), );

Funktsiya navbatma-navbat massivning barcha elementlariga qo'llaniladi va uning natijasini keyingi chaqiruvga "o'tkazadi".

Argumentlar:

  • oldingi qiymat - bu funktsiyaning oldingi chaqiruvining natijasi, birinchi qo'ng'iroqdagi boshlang'ichga teng (agar boshlang'ich qabul qilingan bo'lsa),
  • element - massivning keyingi elementi,
  • indeks - uning indeksi,
  • massiv - massivning o'zi.

Funksiya chaqirilganda uning massivning oldingi elementiga chaqirilishi natijasi birinchi argument sifatida uzatiladi.

Bu murakkab ko'rinadi, lekin agar siz birinchi argumentni oldingi funktsiya chaqiruvlari natijasini "to'plash" deb hisoblasangiz, u osonroq bo'ladi. Tugatgandan so'ng, u qisqartirish natijasi bo'ladi.

Bu usul, har doimgidek, misol bilan tushunish uchun eng oson.

Bu erda biz barcha massiv elementlarining yig'indisini bitta satrda olamiz:

arr = bo'lsin; let natija = arr.reduce((summa, joriy) => summa + joriy, 0); ogohlantirish (natija); // 15

Bu erda biz faqat 2 ta argumentdan foydalanadigan eng keng tarqalgan kamaytirish variantidan foydalandik.

Keling, qanday ishlashini batafsil ko'rib chiqaylik.

  1. Birinchi ishga tushirishda sum boshlang'ich (kamaytirishning oxirgi argumenti), bu 0, joriy esa massivning birinchi elementi bo'lib, u 1. Shunday qilib, funktsiyaning natijasi 1 ga teng.
  2. Ikkinchi marta sum = 1 ni ishga tushirganimizda, unga massivning ikkinchi elementini (2) qo'shamiz.
  3. Uchinchi yugurishda sum = 3, biz keyingi elementni qo'shamiz va hokazo ...

Hisoblash jarayoni quyidagicha ko'rinadi:

Jadval ko'rinishida, bu erda har bir satr massivning keyingi elementida funktsiya chaqiruvi bo'ladi:

so'm joriy natija
birinchi qo'ng'iroq 1 1
ikkinchi qo'ng'iroq 1 2 3
uchinchi qiyinchilik 3 3 6
to'rtinchi qiyinchilik 6 4 10
beshinchi qiyinchilik 10 5 15

Bu erda oldingi qo'ng'iroqning natijasi keyingisining birinchi argumentiga qanday o'tishini aniq ko'rishingiz mumkin.

Biz boshlang'ich qiymatni ham o'tkazib yuborishimiz mumkin:

arr = bo'lsin; // boshlang'ich qiymat o'chiriladi (oxirida 0 yo'q) natija bo'lsin = arr.reduce((sum, joriy) => summa + joriy); ogohlantirish (natija); // 15

Natija aynan bir xil! Buning sababi, boshlang'ich bo'lmaganda, massivning birinchi elementi 1-qiymat sifatida qabul qilinadi va qidiruv ikkinchisidan boshlanadi.

Hisoblash jadvali bir xil minus birinchi qator bo'ladi.

Ammo bunday foydalanish juda ehtiyotkorlikni talab qiladi. Agar massiv bo'sh bo'lsa, boshlang'ich qiymatsiz kamaytirish chaqiruvi xatoga yo'l qo'yadi.

Mana bir misol:

arr = bo'lsin; // Xato: Boshlang'ich qiymatsiz bo'sh massivni qisqartirish // Agar boshlang'ich qiymat bo'lsa, kamaytirish uni bo'sh massiv uchun qaytaradi. arr.reduce((sum, joriy) => yig'indi + joriy);

Natijalar

Xulosa qilib aytadigan bo'lsak, biz tsikldagi massivlar bilan ishlashning turli usullarini ko'rib chiqdik.

  • forEach - massiv bo'ylab aylanish uchun.
  • filter - massivni filtrlash uchun. Yangi filtrlangan massivni qaytaradi
  • every/some - massivda alohida elementlar mavjudligini tekshirish.
  • map - massivni massivga aylantirish uchun. Asl aylantirilgan massivni qaytaradi.
  • kamaytirish/reduceRight - butun massivdan bitta qiymatni hisoblab chiqadi, har bir elementda funktsiyani chaqiradi va qo'ng'iroqlar orasida oraliq natijani uzatadi. Massiv elementlari yig'indisini hisoblash uchun foydalanish mumkin.

Vazifalar

Yangi massivni oling

var mas = ["HTML", "CSS", "JavaScript", "Paskal"] massivi berilsin, siz asl massivning har bir elementining uzunligini o'z ichiga olgan yangi massivni olish uchun xarita usulidan foydalanishingiz kerak. .

Massivni filtrlang

massiv bor mas = faqat musbat raqamlarni o'z ichiga olgan massivni olish uchun filtr usulidan foydalanish kerak.

Massivni tekshiring

Massiv bor mas = massivda manfiy sonlar mavjudligini tekshirish va natijani ekranga chiqarish kerak.

Xulosa qilib aytganda, massivda aylanish usullari haqida qisqacha video.

  • Tarjima
  • I. Haqiqiy massivlar ustida takrorlash
    1. forEach usuli va tegishli usullar
    2. loop uchun
    3. for...in tsiklidan to'g'ri foydalanish
    4. for...of loop (iteratordan bilvosita foydalanish)
    5. Iteratordan aniq foydalanish
    1. Haqiqiy massivlarni takrorlash usullaridan foydalanish
    2. Haqiqiy massivga aylantiring
    3. Ish vaqti ob'ektlari haqida eslatma

I. Haqiqiy massivlar ustida takrorlash

Hozirgi vaqtda haqiqiy massiv elementlarini takrorlashning uchta usuli mavjud:
  1. usul Array.prototype.forEach ;
  2. klassik for loop
  3. for...in loop uchun "to'g'ri" qurilgan.
Bundan tashqari, tez orada yangi ECMAScript 6 (ES 6) standarti paydo bo'lishi bilan yana ikkita usul kutilmoqda:
  1. for...of loop (iteratorning bilvosita ishlatilishi);
  2. iteratordan aniq foydalanish.

1. ForEach usuli va tegishli usullar

Agar sizning loyihangiz ECMAScript 5 (ES5) standarti xususiyatlarini qo‘llab-quvvatlashga mo‘ljallangan bo‘lsa, siz uning innovatsiyalaridan biri – forEach usulidan foydalanishingiz mumkin.

Foydalanish misoli:
var a = ["a", "b", "c"]; a.forEach(funksiya(kirish) ( console.log(kirish); ));
Umuman olganda, forEach-dan foydalanish ushbu usulni qo'llab-quvvatlamaydigan brauzerlar uchun es5-shim emulyatsiya kutubxonasini ulashni talab qiladi. Bularga IE 8 va undan oldingi versiyalar kiradi, ular hali ham ba'zi joylarda qo'llaniladi.

ForEach ning afzalligi shundaki, joriy massiv elementining indeksi va qiymatini saqlash uchun mahalliy o'zgaruvchilarni e'lon qilishning hojati yo'q, chunki ular avtomatik ravishda qayta qo'ng'iroq qilish funksiyasiga argument sifatida uzatiladi.

Agar siz har bir elementga qayta qo'ng'iroq qilishning mumkin bo'lgan narxidan xavotirda bo'lsangiz, tashvishlanmang va buni o'qing.

ForEach massivning barcha elementlarini takrorlash uchun mo'ljallangan, ammo unga qo'shimcha ravishda ES5 barcha yoki ayrim elementlarni takrorlash hamda ular ustida ba'zi amallarni bajarish uchun yana bir qancha foydali usullarni taklif etadi:

  • every - agar massivning har bir elementi uchun qayta qo'ng'iroq rostga aylantirilishi mumkin bo'lgan qiymatni qaytarsa, true qiymatini qaytaradi.
  • some - agar massivning kamida bitta elementi uchun qayta qo'ng'iroq rostga aylantirilishi mumkin bo'lgan qiymatni qaytarsa, true qiymatini qaytaradi.
  • filter - qayta qo'ng'iroq rost qaytaradigan asl massivning elementlarini o'z ichiga olgan yangi massiv yaratadi.
  • map - qayta qo'ng'iroq orqali qaytarilgan qiymatlardan iborat yangi massiv yaratadi.
  • kamaytirish - massivni bitta qiymatga qisqartiradi, birinchisidan boshlab har bir massiv elementiga navbatma-navbat qayta qo'ng'iroqni qo'llaydi (massiv elementlari yig'indisini va boshqa yig'ma funktsiyalarni hisoblash uchun foydali bo'lishi mumkin).
  • reduceRight - kamaytirishga o'xshash ishlaydi, lekin elementlarni teskari tartibda takrorlaydi.

2. Loop uchun

Qoidalar uchun yaxshi eski:

Var a = ["a", "b", "c"]; var indeksi; uchun (indeks = 0; indeks< a.length; ++index) { console.log(a); }
Agar massiv uzunligi butun tsikl davomida doimiy bo'lsa va tsiklning o'zi kodning ishlash uchun muhim bo'limiga tegishli bo'lsa (bu dargumon), u holda massiv uzunligini saqlaydigan "yaxshiroq" versiyasidan foydalanishingiz mumkin. :

Var a = ["a", "b", "c"]; var indeksi, len; uchun (indeks = 0, len = a.uzunlik; indeks< len; ++index) { console.log(a); }
Nazariy jihatdan, bu kod avvalgisidan bir oz tezroq ishlashi kerak.

Agar elementlarning tartibi muhim bo'lmasa, siz optimallashtirish nuqtai nazaridan yanada uzoqroqqa borishingiz va izlash tartibini teskarisiga o'zgartirib, massiv uzunligini saqlash uchun o'zgaruvchidan xalos bo'lishingiz mumkin:

Var a = ["a", "b", "c"]; var indeksi; uchun (indeks = a.uzunlik - 1; indeks >= 0; --index) ( console.log(a); )
Biroq, zamonaviy JavaScript dvigatellarida bunday optimallashtirish o'yinlari odatda hech narsani anglatmaydi.

3. For...in siklidan to‘g‘ri foydalanish

Agar sizga for...in tsiklidan foydalanish tavsiya etilsa, esda tutingki, massivlar ustida takrorlash u mo'ljallanmagan. Keng tarqalgan noto'g'ri tushunchadan farqli o'laroq, for...in tsikli massiv indekslari bo'yicha emas, balki ob'ektning sanab bo'ladigan xususiyatlari orqali takrorlanadi.

Biroq, ayrim hollarda, masalan, siyrak massivlarni takrorlash, quyidagi misolda ko'rsatilganidek, ehtiyot choralarini ko'rsangiz, for...in foydali bo'lishi mumkin:

// a - siyrak massiv var a = ; a = "a"; a = "b"; a = "c"; for (var kaliti a) ( if (a.hasOwnProperty(kalit) && /^0$|^\d*$/.test(kalit) && kaliti<= 4294967294) { console.log(a); } }
Ushbu misolda, tsiklning har bir iteratsiyasida ikkita tekshirish amalga oshiriladi:

  1. massivning kalit deb nomlangan o'z xususiyatiga ega ekanligi (uning prototipidan meros bo'lmagan).
  2. bu kalit qiymati 4294967294 dan kichik bo'lgan butun sonning o'nli ko'rinishini o'z ichiga olgan qatordir. Oxirgi raqam qayerdan keladi? ES5-dagi massiv indeksining ta'rifidan, bu massivdagi elementning eng yuqori indeksiga ega bo'lishi mumkinligini ko'rsatadi: (2^32 - 2) = 4294967294 .
Albatta, bunday tekshiruvlar tsiklni bajarishda qo'shimcha vaqtni oladi. Ammo siyrak massivda bu usul for sikliga qaraganda samaraliroq, chunki bu holda faqat massivda aniq belgilangan elementlar takrorlanadi. Shunday qilib, yuqoridagi misolda faqat 3 ta takrorlash amalga oshiriladi (0, 10 va 10000 indekslari uchun) - for tsiklidagi 10001ga nisbatan.

Har safar massivni takrorlash kerak bo'lganda bunday noqulay tekshirish kodini yozmaslik uchun uni alohida funktsiya sifatida yozishingiz mumkin:

Funktsiya arrayHasOwnIndex(massiv, kalit) ( qaytish array.hasOwnProperty(kalit) && /^0$|^\d*$/.test(kalit) && tugmasi<= 4294967294; }
Keyin misoldagi pastadir tanasi sezilarli darajada kamayadi:

Uchun (a kaliti) ( if (arrayHasOwnIndex(a, kalit)) ( console.log(a); ) )
Yuqorida muhokama qilingan tekshirish kodi universal bo'lib, barcha holatlarga mos keladi. Buning o'rniga siz qisqaroq versiyadan foydalanishingiz mumkin, garchi rasmiy ravishda to'liq to'g'ri bo'lmasa-da, lekin ko'p hollarda mos keladi:

Uchun (a-da kalit) ( if (a.hasOwnProperty(kalit) && String(parseInt(kalit, 10)) === kalit) ( console.log(a); ) )

4. For...of loop (iteratorning bilvosita ishlatilishi)

ES6, hali qoralama holatida, JavaScript-ga iteratorlarni kiritishi kerak.

Iterator qiymatlar ketma-ketligini (cheklangan yoki cheksiz) olishning standart usulini belgilaydigan ob'ekt tomonidan amalga oshiriladigan protokol.
Iterator - keyingi() usulini belgilaydigan ob'ekt - ikkita xususiyatga ega ob'ektni qaytaradigan argumentsiz funksiya:

  1. bajarildi (boolean) - agar iterator takrorlanadigan ketma-ketlikning oxiriga yetgan bo'lsa, rost. Aks holda qiymat noto'g'ri bo'ladi.
  2. qiymat - iterator tomonidan qaytarilgan qiymatni belgilaydi. Bajarilgan xususiyat rost bo'lsa, aniqlanmagan (yo'qolgan) bo'lishi mumkin.
Ko'p o'rnatilgan ob'ektlar, shu jumladan. haqiqiy massivlarda sukut bo'yicha iteratorlar mavjud. Haqiqiy massivlarda iteratordan foydalanishning eng oddiy usuli bu new for...of construct dan foydalanishdir.

For...of dan foydalanishga misol:

Varval; var a = ["a", "b", "c"]; uchun (a vali) ( console.log(val); )
Yuqoridagi misolda for...of sikli massivning har bir qiymatini olish uchun Array obyektining iteratorini bilvosita chaqiradi.

5. Iteratorning aniq ishlatilishi

Iteratorlar ham aniq ishlatilishi mumkin, ammo bu holda kod for...of tsikliga nisbatan ancha murakkablashadi. Bu shunday ko'rinadi:

Var a = ["a", "b", "c"]; var it = a.entries(); var entry; esa (!(entry = it.next()).done) ( console.log(entry.value); )
Ushbu misolda Array.prototype.entries usuli massiv qiymatlarini ko'rsatish uchun ishlatiladigan iteratorni qaytaradi. Har bir iteratsiyada entry.value [kalit, qiymat] shakldagi massivni o'z ichiga oladi.

II. Massivga o'xshash ob'ektlar ustida takrorlash

Haqiqiy massivlardan tashqari, JavaScript-da ham mavjud massivga o'xshash ob'ektlar . Ularning haqiqiy massivlar bilan umumiy tomoni shundaki, ular uzunlik xususiyatiga va massiv elementlariga mos keladigan raqamlar deb nomlangan xususiyatlarga ega. Misollar NodeList to'plamining DOM-ni va har qanday funktsiya/usul ichida mavjud bo'lgan psevdo-massiv argumentlarini o'z ichiga oladi.

1. Haqiqiy massivlarni takrorlash usullaridan foydalanish

Hech bo'lmaganda, massivga o'xshash ob'ektlarni takrorlash uchun haqiqiy massivlar bo'yicha takrorlash usullaridan foydalanish mumkin.

For va for...in konstruksiyalari massivga o‘xshash obyektlarga xuddi real massivlar bilan bir xil tarzda qo‘llanilishi mumkin.

ForEach va boshqa Array.prototype usullari massivga o'xshash ob'ektlarga ham tegishli. Buning uchun Function.call yoki Function.apply dan foydalanishingiz kerak.

Misol uchun, agar siz Node ob'ektining childNodes xususiyatiga forEach ni qo'llamoqchi bo'lsangiz, buni shunday qilasiz:

Array.prototype.forEach.call(node.childNodes, function(child) ( // bola ob'ekt bilan biror narsa qilish));
Ushbu hiylani qayta ishlatishni osonlashtirish uchun siz Array.prototype.forEach usuliga havolani alohida oʻzgaruvchida eʼlon qilishingiz va undan yorliq sifatida foydalanishingiz mumkin:

// (Quyidagi barcha kodlar bir xil doirada bo'lsa) var forEach = Array.prototype.forEach; // ... forEach.call(node.childNodes, function(child) ( // bola ob'ekt bilan biror narsa qilish));
Agar massivga o'xshash ob'ekt iteratorga ega bo'lsa, u haqiqiy massivlardagi kabi ob'ektni takrorlash uchun aniq yoki bilvosita ishlatilishi mumkin.

2. Haqiqiy massivga aylantiring

Bundan tashqari, massivga o'xshash ob'ektni takrorlashning yana bir juda oddiy usuli mavjud: uni haqiqiy massivga aylantiring va haqiqiy massivlar ustida takrorlash uchun yuqorida ko'rib chiqilgan usullardan foydalaning. Konvertatsiya qilish uchun siz har qanday massivga o'xshash ob'ektga qo'llanilishi mumkin bo'lgan umumiy Array.prototype.slice usulidan foydalanishingiz mumkin. Bu quyidagi misolda ko'rsatilganidek, juda sodda tarzda amalga oshiriladi:

Var trueArray = Array.prototype.slice.call(arrayLikeObject, 0);
Misol uchun, agar siz NodeList to'plamini haqiqiy massivga aylantirmoqchi bo'lsangiz, sizga shunday kod kerak bo'ladi:

Var divs = Array.prototype.slice.call(document.querySelectorAll("div"), 0);
Yangilash: Izohlarda qayd etilganidek