En el siguiente ejemplo, verá una implementación ruidosa pero sencilla.
Situación inicial
Tenemos un Array inicial con información repetitiva.
const listArray = [ { songBy: 'George Michael', uid: 'A', whatEver: 12}, { songBy: 'George Michael', uid: 'A', whatEver: 13}, { songBy: 'George Michael', uid: 'A', whatEver: 14}, { songBy: 'Michael Jackson', uid: 'B', whatEver: 12}, { songBy: 'Michael Jackson', uid: 'B', whatEver: 16}, ]PASO 1
Creamos un nuevo Mapa porque claramente queremos guardar los nombres de los artistas, lo que significa que → no hay repeticiones de nombres de artistas (y también queremos deshacernos de la tercera columna, por cierto).
Necesitamos usar songBy como clave, por alguna razón. Lo cambiamos dentro del valor en name .
const listMap = new Map(); listArray.forEach( row => listMap.set( row.songBy, {name: row.songBy, uid: row.uid} ) );PASO 2
Finalmente, necesitamos una matriz con sus valores:
const distinctListArray: Array<any> = []; listMap.forEach(value => distinctListArray.push(value));Entonces logramos un resultado como una matriz de objetos distintos en forma de:
[ name: string uid: string ]Pregunta:
En mi opinión, esta implementación es demasiado ruidosa y no tan elegante. Hay demasiados pasos y demasiadas variables. (Este ejemplo aquí es una versión simplificada de un código real que no puedo compartir).
¿Hay alguna manera de simplificar ese código y hacerlo más eficiente?
Convierta la lista en pares [key, value] usando Array.map() y luego cree el mapa a partir de la lista. Vuelva a convertir el Map en una matriz aplicando Array.from() al iterador Map.values() (patio de juegos de TS ):
const listArray = [{"songBy":"George Michael","uid":"A","whatEver":12},{"songBy":"George Michael","uid":"A","whatEver":13},{"songBy":"George Michael","uid":"A","whatEver":14},{"songBy":"Michael Jackson","uid":"B","whatEver":12},{"songBy":"Michael Jackson","uid":"B","whatEver":16}] const distinctListArray = Array.from( new Map(listArray.map(({ songBy, uid }) => [songBy, { name: songBy, uid }] )).values() ) console.log(distinctListArray)