He creado un ejemplo para que entiendas el problema.
let arr = []; arr.push({ module_id: 41, name: 'first' }, { module_id: 41, name: 'second', important: true, }, { module_id: 43, name: 'third' }); const lookup = arr.reduce((a, e) => { a[e.module_id] = ++a[e.module_id] || 0; return a; }, {}); console.log('lookup is', lookup); let unique = []; arr.filter((e) => { if (lookup[e.module_id] === 0) { unique.push(e) } }) console.log('unique', unique) primero, tengo una matriz arr vacía y estoy insertando 3 objetos en ella.
Observe, el module_name . Hay dos repeticiones y me gustaría usar la segunda con el nombre de propiedad important .
He usado reduce aquí para averiguar cuál se repite en función de module_name . devolverá 1 con la clave de 41 y 0 para 43. Quiero usar ambos pero no quiero duplicar en mi matriz unique . Actualmente, enviaré solo aquellos elementos que son únicos, en nuestro caso module_id: 43 .
Ahora, ¿cómo puedo obtener el valor duplicado (con propiedad important )?
Puede tomar un Map y obtener solo los primeros valores distintos o los que tienen una bandera importante.
const array = [{ module_id: 41, name: 'first' }, { module_id: 41, name: 'second', important: true }, { module_id: 43, name: 'third' }], result = Array.from(array .reduce( (m, o) => m.set(o.module_id, !o.important && m.get(o.module_id) || o), new Map ) .values() ); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }probar
let unique = []; arr.filter((e) => { if (lookup[e.module_id] === 0) { unique.push(e) } else if (e.important) { unique.push(e) } }) let arr = []; arr.push( { module_id: 41, name: 'first', }, { module_id: 41, name: 'second', important: true, }, { module_id: 43, name: 'third', } ); const result = arr.reduce( (acc, curr) => acc.find((v) => v.module_id === curr.module_id) ? acc : [...acc, curr], [] ); console.log(result);