Hola chicos tengo este escenario:
const data = [ { "name": "Hebert", "timestamp": 1640371815, // 15:50:15 },{ "name": "Brien", "timestamp": 1640373855, // 16:24:15 },{ "name": "Hebert", "timestamp": 1640363601 // 13:33:21 },{ "name": "Mary", "timestamp": 1640356701 // 11:38:21 },{ "name": "Mary", "timestamp": 1640356521 // 11:35:21 },{ "name": "Mary", "timestamp": 1640356401 // 11:33:21 } ];Necesito que me duren uno de los duplicados por marca de tiempo:
// expected result [ { "name": "Hebert", "timestamp": 1640371815 // 15:50:15 newest one },{ "name": "Brien", "timestamp": 1640373855 // 16:24:15 unique },{ "name": "Mary", "timestamp": 1640356701 // 11:38:21 newest } ];Intento esto:
data.sort((a,b) => a.name.localeCompare(b.name)) .filter((chat, index, self) => self.findIndex( c => c.name == chat.name ) == index )salida duplicada eliminada pero sin considerar la marca de tiempo más reciente entre cada duplicado
En lugar de ordenar y usar el filtro, puede iterar la matriz solo una vez almacenando elementos en un Mapa u objeto usando los nombres como claves y luego simplemente actualizar la marca de tiempo más baja a medida que recorre cada elemento.
Luego, finalmente, convierta los valores del objeto nuevamente a la matriz
const items = new Map() data.forEach(({name,timestamp}) => { const o = items.get(name); if(o){ timestamp < o.timestamp && o.timestamp = timestamp; } else { items.set(name, {name, timestamp}); } }); const res = [...items.values()] console.log(res) <script> const data = [ { "name": "Hebert", "timestamp": 1640371815, // 15:50:15 },{ "name": "Brien", "timestamp": 1640373855, // 16:24:15 },{ "name": "Hebert", "timestamp": 1640363601 // 13:33:21 },{ "name": "Mary", "timestamp": 1640356701 // 11:38:21 },{ "name": "Mary", "timestamp": 1640356521 // 11:35:21 },{ "name": "Mary", "timestamp": 1640356401 // 11:33:21 } ]; </script> const data = [ { "name": "Hebert", "timestamp": 1640371815, // 15:50:15 },{ "name": "Brien", "timestamp": 1640373855, // 16:24:15 },{ "name": "Hebert", "timestamp": 1640363601 // 13:33:21 },{ "name": "Mary", "timestamp": 1640356701 // 11:38:21 },{ "name": "Mary", "timestamp": 1640356521 // 11:35:21 },{ "name": "Mary", "timestamp": 1640356401 // 11:33:21 } ]; const seen = {}; const dataModified = []; data.forEach((elem) => { const index = seen[elem.name]; if(index == undefined){ dataModified.push(elem); seen[elem.name] = dataModified.length - 1; } else if(dataModified[index].timestamp < elem.timestamp){ dataModified.splice(index, 1, elem); } }); console.log(dataModified);data.sort((a,b) => a.name.localeCompare(b.name)) .filter((chat, index, self) => self.findIndex(c => c.name === chat.name && c.timestamp > chat.timestamp)<0)La idea es que findIndex solo devuelva el índice cuando exista otro duplicado con una marca de tiempo mayor, de lo contrario devolvería -1.