Set
e Map
hanno API leggermente diverse in termini di valori memorizzati. Mentre Set
s contiene solo valori, Map
s contiene anche le chiavi associate.
Per questo motivo, se entrambe le strutture hanno filter
, map
, forEach
, ... funziona esattamente come fa Array
, la presunzione di impostazione azione su ogni valore iterato è probabile che sia leggermente diversa , in particolare:
Map: function(key, value) { }
Set: function(value) { }
Perché quando si conservano già le chiavi in Map
è logico poter ispezionare anche il valore di key
durante l'iterazione.
Ora, se hai riscontrato una situazione in cui desideri eseguire un'iterazione su una delle due raccolte ma ti interessa solo il valore, ti occorrono due funzioni, una per ogni raccolta di dati.
map.forEach((key, value) => console.log(value));
set.forEach(value => console.log(value));
Anche se ti interessa solo il valore e la logica di entrambe le azioni è chiaramente la stessa, non puoi scrivere una funzione per servire entrambe le raccolte. Il metodo entries
di entrambi Set
e Map
risolve questo problema fornendo un'interfaccia comune.
Creando la seguente funzione (o la sua alternativa, non sono manly uno sviluppatore JS quindi scusami eventuali imprecisioni):
function forEach(entriesIterator, action) {
let current = entriesIterator.next();
while (current.done === false) {
action(current.value[1]);
current = entriesIterator.next();
}
}
puoi alimentare entries
di Map
e / o Set
e funzionerà comunque.
forEach(map.entries(), value => console.log(value));
forEach(set.entries(), value => console.log(value));
TLDR: il metodo entries
fornisce un'astrazione per iterare su una raccolta di dati in cui potresti preoccuparti solo dei valori.