Tengo la siguiente estructura de datos que recibo de la API:
[ { cat_id: '10000844', cat_id_full: '10000844-01', order: '20', }, { cat_id: '10000844', cat_id_full: '10000844-02', order: '50', }, { cat_id: '50000844', cat_id_full: '50000844-52', order: '10', }, { cat_id: '80000844', cat_id_full: '80000844-32', order: '51', }, { cat_id: '80000844', cat_id_full: '80000844-12', order: '12', }, ]El resultado perfecto de limpiar el código sería este resultado, básicamente devolviendo solo la matriz no duplicada ordenada por orden:
[ { cat_id: '10000844', cat_id_full: '10000844-01', order: '20', }, { cat_id: '50000844', cat_id_full: '50000844-52', order: '10', }, { cat_id: '80000844', cat_id_full: '80000844-12', order: '12', }, ]Pero actualmente solo devuelve el primer duplicado encontrado en una matriz única, con el código actual (usando lodash uniqBy, pero no tiene que ser uno usando lodash):
const uniqueCats = uniqBy(cats, 'cat_id');¿Qué tal una reducción rápida?
Object.values(a.reduce((acc, current) => { if(!acc[current.cat_id]) { acc[current.cat_id] = current } else { if (acc[current.cat_id].order > current.order) { acc[current.cat_id] = current } } return acc}, {}))Prueba esto
function removeDublicats(arr = [], proprety = "") { const set = new Set(); const result = []; for (let i = 0; i < arr.length; i++) { const item = arr[i]; if (set.has(item[proprety])) continue; set.add(item[proprety]); result.push(item); } return result; }Puede usar Array.prototype.reduce() y extraer el resultado de la matriz con Object.values()
Código:
const cats = [{cat_id: '10000844',cat_id_full: '10000844-01',order: '20',},{cat_id: '10000844',cat_id_full: '10000844-02',order: '50',},{cat_id: '50000844',cat_id_full: '50000844-52',order: '10',},{cat_id: '80000844',cat_id_full: '80000844-32',order: '51',},{cat_id: '80000844',cat_id_full: '80000844-12',order: '12',},] const uniqBy = (arr, key) => Object.values( arr.reduce((a, c) => { a[c[key]] = a[c[key]]?.order < c.order ? a[c[key]] : c return a }, {})) const uniqueCats = uniqBy(cats, 'cat_id') console.log(uniqueCats)