# Objecte array

Els **Arrays** en JavaScript són objectes especials que s'utilitzen per emmagatzemar col·leccions ordenades de dades. A diferència de molts altres llenguatges, els *arrays* de JavaScript poden contenir dades de diferents tipus (números, strings, objectes, etc.) i tenen una mida dinàmica.

## L'Objecte `Array`

Els *arrays* tenen poques propietats, però la més important és la que defineix la seva mida.

### `length`

La propietat **`length`** retorna el nombre d'elements en un *array*.

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-propietat-descripci%C3%B3" inline-copy-host=""><table><thead><tr><td>Propietat</td><td>Descripció</td><td>Modificable</td></tr></thead><tbody><tr><td>**`length`**</td><td>Retorna el nombre d'elements (o l'índex més alt + 1).</td><td>✅</td></tr></tbody></table>

</div>#### Exemple

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-" inline-copy-host=""></div><div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-184 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-javascript" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="code-block-decoration header-formatted gds-title-s ng-tns-c532567586-184 ng-star-inserted"><span class="ng-tns-c532567586-184">JavaScript</span><div _ngcontent-ng-c532567586="" class="buttons ng-tns-c532567586-184 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c532567586-184 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-184"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-184"></div></div></div>```javascript
let fruites = ['poma', 'plàtan', 'kiwi'];

console.log(fruites.length); // Resultat: 3

// CAS D'ÚS: Truncar (escurçar) l'array
fruites.length = 2;
console.log(fruites); // Resultat: ['poma', 'plàtan']
```

<div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-184 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-184"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-184"></div></div></div>## Mètodes

Els mètodes es divideixen en categories segons la seva funcionalitat:

### Mutació (Modifiquen original)

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-m%C3%A8tode-descripci%C3%B3-ex" inline-copy-host=""><table style="width: 100%;"><thead><tr><td style="width: 18.5811%;">Mètode</td><td style="width: 43.0399%;">Descripció</td><td style="width: 38.379%;">Exemple</td></tr></thead><tbody><tr><td style="width: 18.5811%;">**`push()`**</td><td style="width: 43.0399%;">Afegeix un o més elements al **final** de l'array.</td><td style="width: 38.379%;">`arr.push('nou');`</td></tr><tr><td style="width: 18.5811%;">**`pop()`**</td><td style="width: 43.0399%;">Elimina i retorna l'últim element de l'array.</td><td style="width: 38.379%;">`let ultim = arr.pop();`</td></tr><tr><td style="width: 18.5811%;">**`unshift()`**</td><td style="width: 43.0399%;">Afegeix un o més elements a l'**inici** de l'array.</td><td style="width: 38.379%;">`arr.unshift('inici');`</td></tr><tr><td style="width: 18.5811%;">**`shift()`**</td><td style="width: 43.0399%;">Elimina i retorna el primer element de l'array.</td><td style="width: 38.379%;">`let primer = arr.shift();`</td></tr><tr><td style="width: 18.5811%;">**`splice()`**</td><td style="width: 43.0399%;">Mètode versàtil: permet afegir, eliminar o substituir elements començant per un índex.</td><td style="width: 38.379%;">`arr.splice(2, 1, 'substitut');` (A l'índex 2, elimina 1 i afegeix 'substitut').</td></tr><tr><td style="width: 18.5811%;">**`sort()`**</td><td style="width: 43.0399%;">Ordena els elements de l'array alfabèticament per defecte. Requereix una funció de comparació per a números.</td><td style="width: 38.379%;">`arr.sort((a, b) => a - b);` (Per ordenar números).</td></tr><tr><td style="width: 18.5811%;">**`reverse()`**</td><td style="width: 43.0399%;">Inverteix l'ordre dels elements de l'array.</td><td style="width: 38.379%;">`arr.reverse();`</td></tr></tbody></table>

</div>#### Exemple de Mutació

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host=""></div><div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-185 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-javascript-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="code-block-decoration header-formatted gds-title-s ng-tns-c532567586-185 ng-star-inserted"><span class="ng-tns-c532567586-185">JavaScript</span><div _ngcontent-ng-c532567586="" class="buttons ng-tns-c532567586-185 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c532567586-185 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-185"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-185"></div></div></div>```javascript
let colors = ['blau', 'vermell', 'groc'];

colors.push('verd');     // colors és ara ['blau', 'vermell', 'groc', 'verd']
let eliminat = colors.shift(); // eliminat és 'blau', colors és ['vermell', 'groc', 'verd']

// Elimina 'groc' i afegeix 'taronja'
colors.splice(1, 1, 'taronja'); // colors és ara ['vermell', 'taronja', 'verd']
```

<div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-185 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-185"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-185"></div></div></div>### Accés i Iteració (No modifiquen original)

Aquests mètodes no canvien l'array original, sinó que retornen un valor nou o un nou array.

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-m%C3%A8tode-descripci%C3%B3-ex-1" inline-copy-host=""><table style="width: 100%;"><thead><tr><td style="width: 22.0346%;">Mètode</td><td style="width: 37.0834%;">Descripció</td><td style="width: 40.7628%;">Exemple</td></tr></thead><tbody><tr><td style="width: 22.0346%;">**`concat()`**</td><td style="width: 37.0834%;">Combina dos o més arrays i retorna un **nou array**.</td><td style="width: 40.7628%;">`let nouArr = arr1.concat(arr2);`</td></tr><tr><td style="width: 22.0346%;">**`slice()`**</td><td style="width: 37.0834%;">Retorna una secció superficial (*shallow copy*) de l'array original en un **nou array**.</td><td style="width: 40.7628%;">`let copia = arr.slice(1, 3);` (Des de l'índex 1 fins al 3, sense incloure'l).</td></tr><tr><td style="width: 22.0346%;">**`join()`**</td><td style="width: 37.0834%;">Converteix tots els elements de l'array en una cadena (*string*), utilitzant el separador especificat.</td><td style="width: 40.7628%;">`let text = arr.join(' - ');`</td></tr><tr><td style="width: 22.0346%;">**`indexOf()`**</td><td style="width: 37.0834%;">Retorna el primer índex en què es pot trobar un element, o `-1` si no és present.</td><td style="width: 40.7628%;">`arr.indexOf('groc');`</td></tr><tr><td style="width: 22.0346%;">**`includes()`**</td><td style="width: 37.0834%;">Retorna un booleà (`true` o `false`) indicant si l'array conté un element concret.</td><td style="width: 40.7628%;">`arr.includes('verd');`</td></tr></tbody></table>

</div>#### Exemple d'Accés

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--4" inline-copy-host=""></div><div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-186 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-javascript-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="code-block-decoration header-formatted gds-title-s ng-tns-c532567586-186 ng-star-inserted"><span class="ng-tns-c532567586-186">JavaScript</span><div _ngcontent-ng-c532567586="" class="buttons ng-tns-c532567586-186 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c532567586-186 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-186"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-186"></div></div></div>```javascript
let digits = [1, 2, 3, 4, 5];
let lletres = ['a', 'b'];

// Concat
let combinat = digits.concat(lletres); // [1, 2, 3, 4, 5, 'a', 'b']

// Slice
let part = digits.slice(2, 4); // [3, 4]

// Join
let csv = digits.join(','); // "1,2,3,4,5"
```

<div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-186 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--5" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-186"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-186"></div></div></div>### Iteració d'ordre superior (Looping i Transformació)

Aquests mètodes prenen una funció de *callback* com a argument i són fonamentals en la programació funcional moderna.

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk-m%C3%A8tode-descripci%C3%B3-ca" inline-copy-host=""><table style="width: 100%;"><thead><tr><td style="width: 18.5807%;">Mètode</td><td style="width: 46.7352%;">Descripció</td><td style="width: 34.6841%;">Cas d'Ús</td></tr></thead><tbody><tr><td style="width: 18.5807%;">**`forEach()`**</td><td style="width: 46.7352%;">Executa una funció *callback* una vegada per a cada element. No retorna res.</td><td style="width: 34.6841%;">Executar una acció (p. ex., imprimir) per a cada element.</td></tr><tr><td style="width: 18.5807%;">**`map()`**</td><td style="width: 46.7352%;">Crea un **nou array** amb els resultats de la crida a una funció per a cada element.</td><td style="width: 34.6841%;">Transformar tots els elements d'un array (p. ex., multiplicar per 2).</td></tr><tr><td style="width: 18.5807%;">**`filter()`**</td><td style="width: 46.7352%;">Crea un **nou array** amb tots els elements que superin la prova implementada per la funció de *callback* (que ha de retornar `true`).</td><td style="width: 34.6841%;">Seleccionar elements que compleixen una condició (p. ex., números parells).</td></tr><tr><td style="width: 18.5807%;">**`reduce()`**</td><td style="width: 46.7352%;">Aplica una funció a un acumulador i a cada element de l'array (d'esquerra a dreta) per reduir-lo a un únic valor.</td><td style="width: 34.6841%;">Sumar tots els elements o calcular un valor únic a partir de l'array.</td></tr><tr><td style="width: 18.5807%;">**`find()`**</td><td style="width: 46.7352%;">Retorna el **primer element** de l'array que satisfà la funció de prova.</td><td style="width: 34.6841%;">Trobar el primer objecte que té una propietat específica.</td></tr><tr><td style="width: 18.5807%;">**`some()`**</td><td style="width: 46.7352%;">Retorna `true` si **almenys un** element de l'array satisfà la funció de prova.</td><td style="width: 34.6841%;">Comprovar si hi ha algun producte en estoc.</td></tr><tr><td style="width: 18.5807%;">**`every()`**</td><td style="width: 46.7352%;">Retorna `true` si **tots** els elements de l'array satisfan la funció de prova.</td><td style="width: 34.6841%;">Comprovar si tots els usuaris són majors d'edat.</td></tr></tbody></table>

</div>#### Exemples d'Iteració

<div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--6" inline-copy-host=""></div><div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-187 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk-javascript-3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="code-block-decoration header-formatted gds-title-s ng-tns-c532567586-187 ng-star-inserted"><span class="ng-tns-c532567586-187">JavaScript</span><div _ngcontent-ng-c532567586="" class="buttons ng-tns-c532567586-187 ng-star-inserted"><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c532567586-187 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-187"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-187"></div></div></div>```javascript
const preus = [10, 25, 5, 50];

// 🔸 map(): Crear un nou array amb impostos
const preusAmbIva = preus.map(preu => preu * 1.21);
console.log(preusAmbIva); // Resultat: [12.1, 30.25, 6.05, 60.5]

// 🔸 filter(): Seleccionar només els barats
const ofertes = preus.filter(preu => preu < 30);
console.log(ofertes); // Resultat: [10, 25, 5]

// 🔸 reduce(): Sumar tots els elements
const sumaTotal = preus.reduce((acumulador, valorActual) => acumulador + valorActual, 0);
console.log(sumaTotal); // Resultat: 90
```

<div _ngcontent-ng-c532567586="" class="code-block ng-tns-c532567586-187 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" id="bkmrk--7" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_c6ddd23ec00f50e7","c_3942556f22833484",null,"rc_3af0f00185982bb0",null,null,"ca",null,1,null,null,1,0]]"><div _ngcontent-ng-c532567586="" class="formatted-code-block-internal-container ng-tns-c532567586-187"><div _ngcontent-ng-c532567586="" class="animated-opacity ng-tns-c532567586-187"></div></div></div><div _ngcontent-ng-c3541026175="" class="markdown markdown-main-panel enable-updated-hr-color" dir="ltr" id="bkmrk--8" inline-copy-host=""></div>