Sådan tælles objekter i en matrix

At vide, hvordan man hurtigt itererer gennem en matrix og tæller objekter er vildledende simpelt. Den length()metode vil fortælle dig det samlede antal værdier i array, men hvad hvis du kun ønsker at tælle disse værdier baseret på visse betingelser?

Forestil dig f.eks. At du har en matrix som denne:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ];

Og du vil kun tælle antallet af objekter med statusindstillet til '0'.

Som med næsten alt inden for programmering er der en række måder at gøre dette på. Vi gennemgår et par af de almindelige metoder nedenfor.

Brug en forløkke

Den nemmeste måde er sandsynligvis at erklære en countervariabel, løkke gennem arrayet og counterkun gentage , hvis den statuser lig med '0':

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; let counter = 0; for (let i = 0; i < storage.length; i++) { if (storage[i].status === '0') counter++; } console.log(counter); // 6

Du kan forenkle dette lidt ved hjælp af en for...ofløkke:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; let counter = 0; for (const obj of storage) { if (obj.status === '0') counter++; } console.log(counter); // 6

Du kan også oprette en funktion til at gøre det samme, hvis du har andre arrays af objekter, der skal tælles betinget:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; function statusCounter(inputs) { let counter = 0; for (const input of inputs) { if (input.status === '0') counter += 1; } return counter; } statusCounter(storage); // 6

Brug matrixmetoder

JavaScript indeholder en masse nyttige metoder, når du arbejder med arrays. Hver enkelt kan lænkes til et array og videregives forskellige parametre til at arbejde med, mens det gentages gennem elementerne i arrayet.

De to, vi vil se på, er filter()og reduce().

filter()

Filtermetoden gør netop det - den gentager sig gennem hvert element i arrayet og filtrerer alle elementer ud, der ikke opfylder de betingelser, du giver. Det returnerer derefter et nyt array med alle de elementer, der returnerede true baseret på din (e) tilstand (er).

For eksempel:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; const count = storage.filter(function(item){ if (item.status === 0) { return true; } else { return false; } }); /* [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' } ] */

Nu hvor du har filtreret objektet ud med status: '1', skal du bare kalde length()metoden på det nye array for at få det samlede antal objekter med status: '1':

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; const count = storage.filter(function(item){ if (item.status === 0) { return true; } else { return false; } }).length; // 6

Men dette kan afkortes meget med ES6-syntaks:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; const count = storage.filter(item => item.status === '0').length; // 6

reduce()

Tænk på reduce()metoden som en schweizisk hærkniv - den er ekstremt fleksibel og lader dig tage en matrix som input og omdanne den til næsten alt. Endnu bedre, ligesom filter()denne metode returnerer et nyt array og efterlader originalen uændret.

Du kan læse mere om reduce()i denne artikel.

Til vores formål ønsker vi at tage en matrix, undersøge dens indhold og fremstille et tal. Her er en enkel måde at gøre det på:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; const count = storage.reduce((counter, obj) => { if (obj.status === '0') counter += 1 return counter; }, 0); // 6

Du kan forenkle yderligere ved at bruge ES6-syntaks og en ternær operatør:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; const count = storage.reduce((counter, obj) => obj.status === '0' ? counter += 1 : counter, 0); // 6

Og endnu en smule mere ved at bruge objektdestrukturering:

const storage = [ { data: '1', status: '0' }, { data: '2', status: '0' }, { data: '3', status: '0' }, { data: '4', status: '0' }, { data: '5', status: '0' }, { data: '6', status: '0' }, { data: '7', status: '1' }, ]; const count = storage.reduce((counter, { status }) => status === '0' ? counter += 1 : counter, 0); // 6

Så det er et par måder at gå gennem elementerne i en matrix og tælle dem betinget. Gå nu ud og tæl med tillid!