JavaScript'da yuqori tartibli funksiyalar (HOF), callbacklar, massiv metodlari: forEach, map, filter va chuqur tahlil qilingan reduce metodi.
JavaScript'da function'lar — birinchi darajali qiymatlar (first-class citizens), ya'ni ularni variable'ga saqlash, argument sifatida uzatish va boshqa functiondan qaytarish mumkin. Aynan shu xususiyat Higher-Order Functionlarni yuzaga keltiradi.
Higher-Order Function (HOF) — boshqa functionni argument sifatida qabul qiladigan yoki function qaytaradigan function.
HOF orqali kodni qayta ishlatish, mavhumlashtirish (abstraction) va o'qish osonlashadi — takrorlanuvchi mantiqni bir joyga jamlab, faqat farq qiladigan qismini parametr sifatida berish mumkin.
🏭 HOF'ni "moslashuvchan ishlab chiqarish liniyasi" deb tasavvur qiling: liniyaning o'zi o'zgarmaydi, lekin unga turli "vazifa qog'ozlari" (function'lar) berish orqali turlicha natija olish mumkin.
script.jsJavaScriptfunction greet(name) {return "Salom, " + name;}function processUser(name, callback) {return callback(name);}console.log(processUser("Ali", greet)); // "Salom, Ali"
processUser — HOF, chunki u callback nomli functionni argument sifatida qabul qiladi va uni ichkarida chaqiradi.
Bu — Chapter 12'da ko'rgan createMultiplier misolining o'zi:
script.jsJavaScriptfunction createMultiplier(multiplier) {return function (number) {return number * multiplier;};}
🔗 Connection
Aslida Closure (Chapter 12) va Higher-Order Function bir-biri bilan chambarchas bog'liq — function qaytaruvchi HOF'lar deyarli har doim closure yaratadi.
forEach() — array'ning har bir elementi uchun berilgan functionni chaqiradi.
script.jsJavaScriptlet numbers = [1, 2, 3, 4];numbers.forEach(function (num) {console.log(num * 2);});// 2, 4, 6, 8
script.jsJavaScriptnumbers.forEach(num => console.log(num * 2));
⚠️ Common Mistake
forEach() hech narsa qaytarmaydi (undefined). Agar yangi array kerak bo'lsa, map() ishlatish kerak (keyingi bo'lim).
map() — har bir elementni o'zgartirib, yangi array qaytaradi. Asl array o'zgarmaydi.
script.jsJavaScriptlet numbers = [1, 2, 3, 4];let doubled = numbers.map(num => num * 2);console.log(doubled); // [2, 4, 6, 8]console.log(numbers); // [1, 2, 3, 4] — o'zgarmagan
🏭 map() — bu konveyer: har bir mahsulot (element) stansiyadan o'tadi, qandaydir o'zgartirish (masalan, rang berish) qo'llaniladi, va natijada yangi mahsulotlar to'plami hosil bo'ladi — eskisi esa saqlanib qoladi.
script.jsJavaScriptlet users = [{ name: "Ali", age: 25 },{ name: "Vali", age: 30 }];let names = users.map(user => user.name);console.log(names); // ["Ali", "Vali"]
filter() — berilgan shartga mos keladigan elementlardangina iborat yangi array qaytaradi.
script.jsJavaScriptlet numbers = [1, 2, 3, 4, 5, 6];let evens = numbers.filter(num => num % 2 === 0);console.log(evens); // [2, 4, 6]
filter() ichidagi function har bir element uchun true yoki false qaytarishi kerak. true bo'lsa, element yangi array'ga qo'shiladi.
script.jsJavaScriptlet users = [{ name: "Ali", age: 17 },{ name: "Vali", age: 25 },{ name: "Karim", age: 30 }];let adults = users.filter(user => user.age >= 18);console.log(adults); // Vali va Karim
🔗 Connection
map() va filter()ni birga zanjir (chain) qilib ishlatish mumkin — bu Chapter 15'da yanada chuqurroq o'rganiladi.
reduce() — array'ning barcha elementlarini birlashtirib, bitta natija (son, string, object — istalgan narsa) hosil qiladi. Bu — array metodlari ichida eng ko'p tushunish qiyin bo'lgani, chunki uning ishlash mantig'i boshqalarga o'xshamaydi.
🍲 reduce()ni ovqat tayyorlashga o'xshating: siz bir nechta ingredientni (array elementlari) ketma-ket qozonga solasiz, va oxirida bitta taom (yakuniy natija) hosil bo'ladi. Har bir ingredient qo'shilganda, "qozon hozircha qanday holatda" (accumulator) yangilanib boradi.
script.jsJavaScriptarray.reduce(function (accumulator, currentValue) {// accumulator — "hozirgacha to'plangan natija"// currentValue — joriy elementreturn yangiAccumulator;}, boshlangichQiymat);
script.jsJavaScriptlet numbers = [1, 2, 3, 4];let sum = numbers.reduce(function (acc, current) {return acc + current;}, 0);console.log(sum); // 10
| Qadam | acc (kirishda) | current | acc (qaytariladi) |
|---|---|---|---|
| 1 | 0 (boshlang'ich) | 1 | 0 + 1 = 1 |
| 2 | 1 | 2 | 1 + 2 = 3 |
| 3 | 3 | 3 | 3 + 3 = 6 |
| 4 | 6 | 4 | 6 + 4 = 10 |
Yakuniy natija: 10
code.textTEXTboshlang'ich: acc = 0↓[1, 2, 3, 4] elementlari orqali o'tiladi↓acc=0 + 1 → acc=1acc=1 + 2 → acc=3acc=3 + 3 → acc=6acc=6 + 4 → acc=10 (yakuniy natija)
💡 Key Idea
Ikkinchi argument (0) — boshlang'ich qiymat. Agar uni bermasangiz, reduce() array'ning birinchi elementini boshlang'ich acc sifatida oladi — lekin bu ba'zida kutilmagan natijaga olib kelishi mumkin, shuning uchun boshlang'ich qiymatni har doim aniq yozish tavsiya etiladi.
script.jsJavaScriptlet fruits = ["olma", "banan", "olma", "uzum", "banan", "olma"];let count = fruits.reduce(function (acc, fruit) {acc[fruit] = (acc[fruit] || 0) + 1;return acc;}, {});console.log(count); // { olma: 3, banan: 2, uzum: 1 }
Bu yerda acc — son emas, balki object. Har bir mevaning nechta marta uchraganini hisoblab boradi.
⚠️ Common Mistake
reduce() ichida return yozishni unutish — bu accni keyingi qadamda undefined qilib qo'yadi.
Task:
[5, 10, 15, 20] array'idagi har bir sonni 2ga bo'lib, yangi array hosil qiling (map() yordamida).
Required Concepts:
map()array.map(num => num / 2) dan foydalaning.Task:
Berilgan array ichidan faqat 18 yoshdan katta foydalanuvchilarning ismlarini oling (filter() va map()ni birga ishlating):
script.jsJavaScriptlet users = [{ name: "Ali", age: 15 },{ name: "Vali", age: 22 },{ name: "Nodira", age: 19 }];
Required Concepts:
filter()map()filter() bilan saralang, keyin map() bilan faqat ismlarni oling.Task:
reduce() yordamida array ichidagi eng katta sonni toping (Math.max ishlatmasdan).
script.jsJavaScriptlet numbers = [4, 12, 8, 25, 3];
Required Concepts:
reduce()acc va currentni solishtirib, kattasini qaytaring.script.jsJavaScriptlet numbers = [1, 2, 3];let result = numbers.map(num => num * 2).filter(num => num > 3);console.log(result);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> [4, 6]Why?
Avval map(num => num * 2) — [2, 4, 6] hosil qiladi. Keyin filter(num => num > 3) — faqat 3dan katta elementlarni qoldiradi: [4, 6].
Quyidagi kodda muammo bor:
script.jsJavaScriptlet numbers = [1, 2, 3, 4];let sum = numbers.reduce(function (acc, current) {acc + current;});console.log(sum);
Your Task:
Yechim:
</details>script.jsJavaScriptlet numbers = [1, 2, 3, 4];let sum = numbers.reduce(function (acc, current) {return acc + current;}, 0);console.log(sum); // 10
forEach() — har bir element uchun amal bajaradi, hech narsa qaytarmaydi.map() — har bir elementni o'zgartirib, yangi array qaytaradi.filter() — shartga mos elementlarni saralaydi.reduce() — barcha elementlarni bitta natijaga "yig'adi".map, filter, reduce — asl array'ni o'zgartirmaydi (immutable yondashuv).reduce()ning boshlang'ich qiymatini har doim aniq belgilash tavsiya etiladi.map().filter()) kodni qisqa va o'qish oson qiladi.forEach() yangi array yaratmaydi — faqat "har biri uchun amal bajarish" uchun ishlatiladi.reduce() — eng moslashuvchan metod, u orqali map va filterning o'zini ham qayta yaratish mumkin.script.jsJavaScriptarray.forEach(item => { }); // amal bajarish, qaytarmaydiarray.map(item => item * 2); // yangi array (o'zgartirilgan)array.filter(item => item > 5); // yangi array (saralangan)array.reduce((acc, item) => acc + item, 0); // bitta natija
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: