Map.prototype.getOrInsert / getOrInsertComputed în JavaScript

Map și Set Nou (Node.js 26, browsere recente)

Returnează valoarea unei chei; dacă lipsește, o adaugă mai întâi cu o valoare implicită.

Sintaxă
map.getOrInsert(cheie, valoareImplicita)
map.getOrInsertComputed(cheie, (cheie) => valoare)

Ce face Map.prototype.getOrInsert / getOrInsertComputed

Un tipar foarte des întâlnit este: „dacă cheia nu există, pune o valoare implicită, apoi citește valoarea”. getOrInsert face asta într-un singur apel. Dacă cheia există deja, valoarea ei nu este schimbată.

getOrInsertComputed primește o funcție în loc de valoare și o apelează doar când cheia lipsește, ceea ce evită crearea inutilă a unor obiecte sau calcule scumpe. Ambele metode există și pe WeakMap. Sunt adăugări noi în limbaj: verifică suportul înainte să le folosești în browsere.

Parametri

Parametru Descriere
cheie Cheia căutată.
valoareImplicita / functie Valoarea pusă dacă cheia lipsește, sau funcția care o calculează.

Ce returnează

Valoarea existentă sau cea nou inserată.

Exemple

Exemplul 1: Gruparea cu un tablou pentru fiecare cheie

const peOrase = new Map();
const clienti = [["Iași", "Ana"], ["Cluj", "Dan"], ["Iași", "Ioana"]];

for (const [oras, nume] of clienti) {
  peOrase.getOrInsertComputed(oras, () => []).push(nume);
}
console.log(peOrase);

Rezultat

Map(2) { 'Iași' => [ 'Ana', 'Ioana' ], 'Cluj' => [ 'Dan' ] }

Exemplul 2: Valoarea existentă nu este suprascrisă

const setari = new Map([["tema", "întunecată"]]);

console.log(setari.getOrInsert("tema", "deschisă"));
console.log(setari.getOrInsert("limba", "ro"));
console.log(setari);

Rezultat

întunecată
ro
Map(2) { 'tema' => 'întunecată', 'limba' => 'ro' }

Greșeli frecvente

  • Folosești getOrInsert(cheie, []) într-o buclă. Tabloul gol este creat la fiecare apel, chiar dacă nu e nevoie de el; getOrInsertComputed îl creează doar când lipsește cheia.

Comenzi înrudite

  • Map (get, set, has, delete): O colecție de perechi cheie–valoare în care cheile pot fi de orice tip și ordinea este păstrată.
  • Object.groupBy / Map.groupBy: Grupează elementele unei liste după o cheie calculată, într-un obiect sau într-un Map.
  • WeakMap: Un Map cu chei obiecte, care nu împiedică ștergerea obiectelor din memorie.