Me gustaría entender cómo regresar de una matriz .reduce de elementos que no contienen duplicados.
La matriz que tengo es particular:
['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']
En detalles, la cadena dentro de la matriz está formada por 2 identificadores como ejemplo
Entonces, lo que necesito inicialmente es dividir los elementos de la matriz sin tener el - por lo que el resultado será el siguiente:
[0: JJ2AG, 1: 001099]
Luego, debería verificar desde newArry si el 0 de cada elemento es único y, como resultado, debería tener solo una matriz:
['JJ2AG', 'JJ3AG', 'JJ4AG']
Entonces, esta última matriz contiene solo una vez la parte 0 de cada elemento como se describe arriba
Traté de usar reduce pero no puedo entender cómo tener esta nueva matriz y no puedo usar bucles como for y forEach según los requisitos que tengo, así que lo que he hecho hasta ahora en el fragmento pero no tengo idea de cómo crear una nueva matriz como necesito como
['JJ2AG', 'JJ3AG', 'JJ4AG']
const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']; const x = ids.reduce(( acc, item) => { console.log('ACC', acc); console.log('ITEM', item); const splited = item.split('-'); console.log(splited); const groupId = splited[0]; console.log(groupId); return acc.includes(groupId) ? [splited] : [...acc, item]; }, []); console.log(x)Como parece que estás en JavaScript moderno, puedes usar Set para esto:
const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']; const x = [...new Set(ids.map(id => id.split("-")[0]))] console.log(x) El conjunto toma elementos únicos de una matriz, así que primero, asigne todos los identificadores a la primera parte de la cadena ( id.split("-")[0] ), conviértalo en un conjunto y, usando la extensión, vuelva a convertirlo en una matriz.
Solo cambia:
return acc.includes(groupId) ? [splited] : [...acc, item];A:
return acc.includes(groupId) ? acc : [...acc, groupId]; Cada vez que se encuentra un duplicado, básicamente está eliminando las ID únicas anteriores y, en su lugar, devuelve el duplicado con [groupId] ; en su lugar, debe devolver los ID únicos sin cambios. También debe agregar a la matriz de ID únicos groupId not item . Vea la demostración a continuación:
const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']; const x = ids.reduce(( acc, item) => { //console.log('ACC', acc); //console.log('ITEM', item); const splited = item.split('-'); //console.log(splited); const groupId = splited[0]; //console.log(groupId); return acc.includes(groupId) ? acc : [...acc, groupId]; }, []); console.log(x)QUE TAMBIÉN PUEDES ESCRIBIR COMO...
const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']; const x = ids.reduce( ( acc, item) => acc.includes(item.split('-')[0]) ? acc : [...acc, item.split('-')[0]] , [] ); console.log(x);Puede usar un Set o puede usar un objeto simple y agregar claves según sea necesario. Este es un oneliner que usa reduce .
Object.keys(ids.reduce((acc, current)=> { acc[current.split("-")[0]]=true; return acc}, {})) Lo que hace es que agrega claves al objeto, si encuentra una clave existente, no importa. Al final necesitas las claves del acumulador y ahí es donde entra en juego Object.keys .