0%

🔄 Cikli

Cikli ļauj atkārtot kodu vairākas reizes. JavaScript piedāvā dažādas ciklu formas – no klasiskajām līdz funkcionālajām.

javascript

for cikls

Teksts
// Pamata for cilpa
for (let i = 0; i < 5; i++) {
    console.log("Iterācija:", i);
} // 0, 1, 2, 3, 4

// Atpakaḷ skaitīšana
for (let i = 10; i >= 0; i--) {
    console.log(i);
}

// Soļi pa 2
for (let i = 0; i <= 20; i += 2) {
    console.log(i); // 0, 2, 4, ... 20
}

// Masīva iterēšana ar for (vecs veids)
const augļi = ["ābols", "bumbieris", "ķirsis"];
for (let i = 0; i < augļi.length; i++) {
    console.log(`${i}: ${augļi[i]}`);
}

// Ligzdoti cikli - reizināšanas tabula
for (let i = 1; i <= 3; i++) {
    for (let j = 1; j <= 3; j++) {
        console.log(`${i} × ${j} = ${i * j}`);
    }
}

while un do…while cikli

Teksts
// while – pārbauda PIRMS izpildes
let skaits = 0;
while (skaits < 5) {
    console.log("Skaits:", skaits);
    skaits++;
}

// do-while – pārbauda PĒC izpildes (min 1 reize)
let x = 10;
do {
    console.log("x =", x);
    x++;
} while (x < 5); // Izpildīsies VIENU reizi pat ja nosacījums false

// Praksē: lietotāja ievades gaidīšana (Node.js piemērs)
let mēģinājumi = 0;
const maks = 3;
let sekmīgs = false;

while (mēģinājumi < maks && !sekmīgs) {
    // Parole pārbaudīšana
    const parole_ok = true; // simulācija
    if (parole_ok) {
        sekmīgs = true;
    } else {
        mēģinājumi++;
        console.log(`Kļūda. Atlikuši: ${maks - mēģinājumi} mēģinājumi`);
    }
}

for…of un for…in

ℹ️ for...of vs for...in

for...of – izmantojiet masīviem un iterējamiem. for...in – izmantojiet objektiem, bet esiet uzmanīgi – tas iterē ARĪ mantotās īpašības. Pārbaudiet ar hasOwnProperty().

Teksts
// for...of  – iterē VĒRTĪBAS (masīvi, virknes, Map, Set)
const pilsētas = ["Rīga", "Liepāja", "Daugavpils"];
for (const pilsēta of pilsētas) {
    console.log(pilsēta); // Rīga, Liepāja, Daugavpils
}

// Ar indeksu izmantojot entries()
for (const [indekss, pilsēta] of pilsētas.entries()) {
    console.log(`${indekss + 1}. ${pilsēta}`);
}

// Virknes iterēšana
for (const burts of "Sveiki") {
    console.log(burts); // S, v, e, i, k, i
}

// Map un Set
const skaitļi = new Set([1, 2, 2, 3, 3, 3]);
for (const sk of skaitļi) {
    console.log(sk); // 1, 2, 3 (unikāli!)
}

// --------------------------------
// for...in  – iterē ATSLĒGAS (objekti)
const lietotājs = { vārds: "Anna", vecums: 28, pilsēta: "Rīga" };
for (const atslēga in lietotājs) {
    console.log(`${atslēga}: ${lietotājs[atslēga]}`);
}
// vārds: Anna
// vecums: 28
// pilsēta: Rīga

Funkcionālie cikli

Teksts
const skaitļi = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// forEach – tikai izpilda, neatgriež jaunu masīvu
skaitļi.forEach((sk, i) => console.log(`${i}: ${sk}`));

// map – transformē katru elementu, atgriež JAUNU masīvu
const kvadrāti = skaitļi.map(sk => sk ** 2);
// [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

// filter – atstāj tikai nosacījumam atbilstošos
const pāra = skaitļi.filter(sk => sk % 2 === 0);
// [2, 4, 6, 8, 10]

// reduce – saliek viesā kopā uz vienu vērtību
const summa = skaitļi.reduce((uzkrāts, sk) => uzkrāts + sk, 0);
// 55

// find – atrod PIRMO atbilstošo elementu
const pirmais_lielāks = skaitļi.find(sk => sk > 5);
// 6

// findIndex – atrod indeksu
const indekss = skaitļi.findIndex(sk => sk > 5);
// 5

// some – vai kaut viens atbilst?
const ir_liels = skaitļi.some(sk => sk > 9);  // true

// every – vai visi atbilst?
const visi_pozitīvi = skaitļi.every(sk => sk > 0); // true

// flat – iztaisno ligzdotus masīvus
const ligzdots = [[1, 2], [3, [4, 5]]];
ligzdots.flat();    // [1, 2, 3, [4, 5]]
ligzdots.flat(2);   // [1, 2, 3, 4, 5]
ligzdots.flat(Infinity); // visi līmeņi

// flatMap – map + flat(1)
const teikumi = ["Sveiki pasaule", "Jauki laiki"];
const vārdi = teikumi.flatMap(t => t.split(" "));
// ["Sveiki", "pasaule", "Jauki", "laiki"]

break un continue

Teksts
// break – pilnībā pārtrauc cilpu
for (let i = 0; i < 10; i++) {
    if (i === 5) break;
    console.log(i); // 0, 1, 2, 3, 4
}

// continue – izlaiž šo iterāciju, turpina nākamo
for (let i = 0; i < 10; i++) {
    if (i % 2 === 0) continue; // Izlaiž pāra skaitļus
    console.log(i); // 1, 3, 5, 7, 9
}

// Iezīme (label) – break/continue ligzdotām cilpām
ārējā: for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 3; j++) {
        if (j === 1) continue ārējā; // Izlaiž ārējo iterāciju
        console.log(i, j);
    }
}
// 0 0, 1 0, 2 0  ← j=1 un j=2 izlaisti

// break while
let attempts = 0;
while (true) { // "bezgalīga" cilpa
    attempts++;
    if (attempts >= 5) {
        console.log("Pārtraucam pēc", attempts, "mēģinājumiem");
        break;
    }
}

Metožu ķēdēšana (chaining)

Teksts
// Vairākas masīva metodes secīgi
const produkti = [
    { nosaukums: "Ābols",    cena: 0.50, kategorija: "augļi" },
    { nosaukums: "Bumbieris",cena: 1.20, kategorija: "augļi" },
    { nosaukums: "Burkāns",  cena: 0.30, kategorija: "dārzeņi" },
    { nosaukums: "Ķirsis",   cena: 2.50, kategorija: "augļi" },
    { nosaukums: "Kāposts",  cena: 0.90, kategorija: "dārzeņi" },
];

// 1. Atrast augļus, 2. Sakārtot pēc cenas, 3. Iegūt nosaukumus
const dārgie_augļi = produkti
    .filter(p => p.kategorija === "augļi")
    .sort((a, b) => b.cena - a.cena)
    .map(p => `${p.nosaukums} (€${p.cena.toFixed(2)})`);

console.log(dārgie_augļi);
// ["Ķirsis (€2.50)", "Bumbieris (€1.20)", "Ābols (€0.50)"]

// Kopējā augļu vērtība
const kopā = produkti
    .filter(p => p.kategorija === "augļi")
    .reduce((summa, p) => summa + p.cena, 0);

console.log("Augļu vērtība: €" + kopā.toFixed(2)); // €4.20