mi pregunta es cómo puedo fusionar elementos en una matriz de objetos y devolver una matriz con objetos únicos. Estaba tratando de usar reduce pero parece que me falta algo y es hora de pedir una pista. Entonces, ¿cómo puede ver que necesito combinar elementos de booleano donde falso es el valor predeterminado y verdadero es datos nuevos, y devolver objetos únicos según el nombre? Gracias por ayudar.
const arr = [ { code: 'test1', name: 'TEST1', url: '/test1', elements: { option1: true, option2: false, option3: false, option4: false, option5: false } }, { code: 'test1', name: 'TEST1', url: '/test1', elements: { option1: false, option2: false, option3: true, option4: false, option5: false } }, { code: 'test1', name: 'TEST1', url: '/test1', elements: { option1: false, option2: false, option3: false, option4: true, option5: false } }, { code: 'test2', name: 'TEST2', url: '/test2', elements: { option1: false, option2: false, option3: true, option4: false, option5: false } }, ]y la salida debe ser:
const arr = [ { code: 'test1', name: 'TEST1', url: '/test1', elements: { option1: true, option2: false, option3: true, option4: true, option5: false } }, { code: 'test2', name: 'TEST2', url: '/test2', elements: { option1: false, option2: false, option3: true, option4: false, option5: false } }, ]Trabajando bajo la suposición de que los elements son lo único que realmente varía aquí, y que no puede cambiar de false a true (ya que parece que lo está buscando), necesitaría iterar sobre la clave: pares de valores en elementos y establecerlo en el valor originalValue || newValue , entonces algo como esto:
const arr = [ { code: 'test1', name: 'TEST1', url: '/test1', elements: { option1: true, option2: false, option3: false, option4: false, option5: false } }, { code: 'test1', name: 'TEST1', url: '/test1', elements: { option1: false, option2: false, option3: true, option4: false, option5: false } }, { code: 'test1', name: 'TEST1', url: '/test1', elements: { option1: false, option2: false, option3: false, option4: true, option5: false } }, { code: 'test2', name: 'TEST2', url: '/test2', elements: { option1: false, option2: false, option3: true, option4: false, option5: false } }, ].reduce((carry, current) => { const existing = carry.find(item => item.code === current.code); if (!existing) { carry.push(current); } else { Object.entries(current.elements).forEach(([k, v]) => { existing.elements[k] = existing.elements[k] || current.elements[k]; }); } return carry; }, []); console.log(arr);