Усулҳои массив
Ин барои чӣ лозим аст
Дар мавзӯи гузашта мо аз массивҳо бо даврҳо гузаштем. Ин кор мекунад, аммо код дароз мешавад: массиви холӣ
сохтан, давр, шарт, push… Массивҳо усулҳо доранд, ки корҳои маъмулро дар як сатр иҷро мекунанд: «ҳар
унсурро табдил деҳ», «танҳо мувофиқҳоро мон», «натиҷаро ҳисоб кун». Чунин код кӯтоҳтар ва хонотар аст, ва дар
лоиҳаҳои воқеӣ ба JavaScript маҳз ҳамин тавр менависанд.
Ҳамаи ин усулҳо колбэк мегиранд — функсияе, ки барои ҳар унсур даъват мешавад. Одатан ин функсияи тирчадор аз мавзӯи 8 аст.
forEach — бо ҳар кадом коре кардан
const names = ["Аня", "Тимур", "Ира"];
names.forEach((name, index) => {
console.log(`${index + 1}. ${name}`);
});
Натиҷа:
1. Аня
2. Тимур
3. Ира
Колбэк унсур, рақами он ва худи массивро мегирад. forEach ҳеҷ чиз барнамегардонад — ин танҳо ивазкунандаи for аст.
map — ҳар кадомро табдил додан
map аз натиҷаҳои колбэк массиви нав-и ҳамон дарозиро месозад:
const prices = [100, 250, 40];
const withTax = prices.map((p) => p * 1.2);
const labels = prices.map((p) => `${p} сомонӣ`);
console.log(withTax);
console.log(labels);
console.log(prices);
Натиҷа:
[120,300,48]
["100 сомонӣ","250 сомонӣ","40 сомонӣ"]
[100,250,40]
Массиви аслӣ иваз намешавад.
filter — мувофиқҳоро мондан
filter массиви навро танҳо аз унсурҳое бармегардонад, ки барои онҳо колбэк true баргардонд:
const nums = [5, 12, 8, 130, 44];
console.log(nums.filter((n) => n > 10));
console.log(nums.filter((n) => n % 2 === 0));
Натиҷа:
[12,130,44]
[12,8,130,44]
find ва findIndex — ёфтани аввалин
const users = [
{ name: "Аня", age: 15 },
{ name: "Тимур", age: 19 },
{ name: "Ира", age: 21 },
];
console.log(users.find((u) => u.age >= 18));
console.log(users.findIndex((u) => u.age >= 18));
console.log(users.find((u) => u.age > 100));
Натиҷа:
{"name":"Тимур","age":19}
1
undefined
(Объектҳои { name: …, age: … }-ро муфассал дар мавзӯи оянда мебинем. Ҳоло кифоя аст: u.age — қимати майдони age.)
some ва every — санҷидан
const ages = [15, 19, 21];
console.log(ages.some((a) => a < 18)); // true — ақаллан яке
console.log(ages.every((a) => a >= 18)); // false — ҳама
reduce — ба як қимат печондан
reduce аз массив мегузарад ва натиҷаро ҷамъ мекунад: сумма, максимум, сатр, объект.
const cart = [300, 150, 50];
const total = cart.reduce((sum, price) => sum + price, 0);
console.log(total);
Натиҷа:
500
Колбэк «ҷамъкунанда» (sum) ва унсури ҷориро мегирад, ва қимати нави ҷамъкунандаро бармегардонад. Аргументи
дуюми reduce (0) — қимати ибтидоии ҷамъкунанда. Қадам ба қадам: 0 + 300 = 300 → 300 + 150 = 450 → 450 + 50 = 500.
sort — ҷобаҷокунӣ
const words = ["гелос", "анор", "банан"];
words.sort();
console.log(words);
const nums = [10, 9, 100, 1];
nums.sort();
console.log(nums); // ногаҳонӣ!
nums.sort((a, b) => a - b);
console.log(nums);
Натиҷа:
["анор","банан","гелос"]
[1,10,100,9]
[1,9,10,100]
Бе колбэк sort унсурҳоро ҳамчун сатр муқоиса мекунад, бинобар ин "100" пеш аз "9" меояд. Барои
ададҳо ҳамеша функсияи муқоисаро диҳед: (a, b) => a - b — афзоянда, (a, b) => b - a — камшаванда.
Муҳим: sort (мисли reverse) массиви аслиро иваз мекунад. Барои нигоҳ доштани он нусхаро ҷобаҷо
кунед: [...arr].sort(…).
Занҷирҳо
Усулҳое, ки массив бармегардонанд, ба занҷир пайваст кардан мумкин аст:
const orders = [120, 45, 300, 80, 15];
const bigTotal = orders
.filter((x) => x >= 50)
.map((x) => x * 0.9)
.reduce((s, x) => s + x, 0);
console.log(bigTotal);
Натиҷа:
450
Мисли ҷумла хонда мешавад: «фармоишҳои аз 50 болоро гир, 10% тахфиф деҳ, ҷамъ кун».
Дар дохил чӣ гуна кор мекунад
Дар дохил ҳар усул — даври оддист. map-ро чунин навиштан мумкин буд:
function myMap(arr, fn) {
const result = [];
for (let i = 0; i < arr.length; i++) result.push(fn(arr[i], i, arr));
return result;
}
Яъне усулҳо аз даврҳо тезтар нестанд — онҳо кӯтоҳтар ва фаҳмотаранд. Ва sort бо колбэк дар ҳар қадам
мепурсад: «a ва b — кӣ аввал?». Ҷавоби манфӣ — a пештар, мусбат — b пештар, сифр — баробаранд.
Хатоҳои маъмул
- Дар колбэк бо қавсҳои фигурӣ
returnнест.arr.map((x) => { x * 2 })массивиundefinedмедиҳад. forEachба ҷойиmap.forEachҳамешаundefinedбармегардонад — массиви нав намесозад.sort-и ададҳо бе функсия.[10, 9, 1].sort()→[1, 10, 9]. Лозим астsort((a, b) => a - b).sortмассиви аслиро вайрон кард. Нусхаро ҷобаҷо кунед:[...arr].sort(…).reduceбе қимати ибтидоӣ. Дар массиви холӣ хато мешавад. Ҳамеша аргументи дуюмро диҳед.
Ёддошт
| Усул | Чӣ мекунад | Чӣ бармегардонад |
|---|---|---|
forEach(fn) |
fn-ро барои ҳар кадом даъват мекунад | undefined |
map(fn) |
ҳар кадомро табдил медиҳад | массиви нави ҳамон дарозӣ |
filter(fn) |
онҳоеро мемонад, ки fn → true | массиви нав |
find(fn) / findIndex(fn) |
аввалини мувофиқ | унсур / рақам (ё undefined / -1) |
some(fn) / every(fn) |
ақаллан яке / ҳама | true / false |
reduce(fn, start) |
ба як қимат мепечонад | қимати ниҳоӣ |
sort((a, b) => a - b) |
дар ҷояш ҷобаҷо мекунад | ҳамон массив |