mapValues & friends

Transforma cada valor, cada clave o la entrada (clave, valor) completa de un map.

Map<K, T> mapValues<K, V, T>(T Function(V value) f, Map<K, V> map) Map<T, V> mapKeys<K, V, T>(T Function(K key) f, Map<K, V> map) Map<K2, V2> mapEntries<K, V, K2, V2>((K2, V2) Function((K, V) entry) f, Map<K, V> map)

Lección

El resto de la sección 9 selecciona de un map — pick, omit, pickBy, omitBy — o lee una parte de él. Estos tres lo transforman. mapValues pasa cada valor por un callback y deja las claves en paz, mapKeys hace lo contrario, y mapEntries toma el record (clave, valor) entero y devuelve uno nuevo.

Ese record tiene la misma forma que ya usan pickBy, omitBy y fromEntries, así que los cuatro componen sin adaptadores: filtras con uno y transformas con el otro. mapEntries generaliza a los otros dos: intercambiar e.$1 y e.$2 invierte un map en una sola llamada.

mapValues no puede perder ninguna entrada, porque las claves quedan intactas. mapKeys y mapEntries sí pueden: si el callback lleva dos claves al mismo resultado, gana la última en orden de iteración, exactamente como haría una clave repetida en un literal de map. Por lo demás el orden de inserción sobrevive, siguiendo la primera aparición de cada clave nueva.

Aquí no hay filter ni filterWithKey, y es deliberado. pickBy y omitBy ya toman el record completo, así que ignorar una mitad es la forma de filtrar por la otra; míralo en la segunda demo.

Compara con evolve, aquí al lado: transforma los valores de claves concretas y deja pasar el resto. mapValues es el caso en que todos los valores reciben el mismo trato.

Demo 1 · Fundamentos

Demo 2 · Colisiones, y filtrar al lado

Pruébalo tú

Ejercicio: convierte cada puntuación en una nota con letra, conservando los nombres.

Relacionado: evolve — transforma solo los valores de las claves indicadas · pickBy / omitBy — los filtros que conocen la clave, con el mismo record · fromEntries — construye un map a partir de records · compactObject — quita los valores null