¿Cuál es el método más eficiente para deduplicar una matriz compleja en función del valor de otra propiedad? He encontrado muchos ejemplos que deduplicarán una matriz o una matriz compleja, pero no este caso de uso específico.
Estoy tratando de encontrar registros con valores únicos en la columna 3 (estado) con el número más alto en la columna 2 (licencia)
var arrayWithDuplicates = [ ["Boat", 1, "NV"], ["Car", 7, "CA"], ["Boat", 3, "NV"], ["Boat", 4, "CA"], ["Car", 5, "OR"], ["Boat", 6, "CA"], ];Resultado deseado
var outputArray = [ ["Car", 7, "CA"], ["Boat", 3, "NV"], ["Car", 5, "OR"] ];Esto funciona, pero no estoy seguro si con grandes conjuntos de datos
var arrayWithDuplicates = [ ["Boat", 1, "NV"], ["Car", 7, "CA"], ["Boat", 3, "NV"], ["Boat", 4, "CA"], ["Car", 5, "OR"], ["Boat", 6, "CA"], ]; let arr= arrayWithDuplicates; let unique = [] for (let i = 0; i < arr.length; i++) { let found = false; for (let j = 0; j < unique.length; j++) { if (arr[i][2] === unique[j][2]) { found = true; if (arr[i][1] > unique[j][1]) { unique[j] = arr[i]; } break; } } if (!found) { unique.push(arr[i]) } } console.log(unique); [["Boat", 3, "NV"], ["Boat", 7, "CA"], ["Car", 5, "OR"]]Puede ver el rendimiento de las soluciones propuestas: https://jsbench.me/eskxxcwnhn/1
Una forma de resolver su problema sería usar una instancia de Mapa para contener el valor más relevante. Luego reemplácelo si encuentra otro. Luego, cuando haya terminado de iterar, tome los valores que están presentes en la instancia del Mapa.
const arrayWithDuplicates = [ ["Boat", 1, "NV"], ["Car", 7, "CA"], ["Boat", 3, "NV"], ["Boat", 4, "CA"], ["Car", 5, "OR"], ["Boat", 6, "CA"], ]; const lookup = new Map(); for (const record of arrayWithDuplicates) { const key = record[2]; if (!lookup.has(key)) { lookup.set(key, record); continue; } const other = lookup.get(key); if (record[1] > other[1]) { // Iteration order is based on insertion order. By removing the // current value first, the new value will be placed at the end. // If you don't care about the order, deletion can be omitted. lookup.delete(key); lookup.set(key, record); } } const result = Array.from(lookup.values()); console.log(result);Tenga en cuenta que la siguiente secuencia de código puede ser una operación bastante pesada:
lookup.delete(key); lookup.set(key, record); Debido al hecho de que reorganiza el orden de iteración de los contenidos del Mapa. Esto solo se hace para obtener el resultado en el orden que buscas. Si el orden de los elementos resultantes es irrelevante, debe eliminar la lookup.delete(key) para mejorar la velocidad de ejecución.
Aunque el uso de instancias de mapas podría producir cierta sobrecarga de ejecución para colecciones pequeñas. La velocidad de búsqueda mejorada realmente brilla cuando las colecciones se hacen más grandes.
Uso de Ordenar y Reducir
const arrayWithDuplicates = [ ["Boat", 1, "NV"], ["Car", 7, "CA"], ["Boat", 3, "NV"], ["Boat", 4, "CA"], ["Car", 5, "OR"], ["Boat", 6, "CA"], ]; let deduped = [...arrayWithDuplicates]; // take a copy deduped.sort((a, b) => { // sorts in place if (a[0] < b[0]) return 1; // sort on names if (a[0] > b[0]) return -1; return b[1] - a[1]; // sort on second element }) // reduce into an object keyed on state deduped = Object.values( // take only the values from the object deduped.reduce((acc, cur) => { const state = cur[2]; if (!acc[state]) acc[state] = cur; return acc; },{})) console.log(deduped)