Quiero duplicar objetos completos dentro de una matriz, según las propiedades dentro del objeto. Necesito duplicar los objetos, según los correos electrónicos divididos, en las nominaciones.
Por ejemplo
array = [ { id:1, name: ravi, nominations: xyz@gmail.com, abc@gmail.com }, { id:2 name: ramu, nominations: 123@gmail.com, 456@gmail.com } ]Necesita salida como
Output_array = [ { id:1, name: ravi, nominations: xyz@gmail.com }, { id:1, name: ravi, nominations: abc@gmail.com }, { id:2 name: ramu, nominations: 123@gmail.com }, { id:2 name: ramu, nominations: 456@gmail.com } ]La forma más sencilla sería aplicar un flatMap sobre los elementos y, a continuación, trazar un map sobre las nominaciones.
const data = [{ id:1, name: "ravi", nominations: "xyz@gmail.com, abc@gmail.com" }, { id:2, name: "ramu", nominations: "123@gmail.com, 456@gmail.com" }]; const result = data.flatMap(item => { return item.nominations.split(", ").map(email => ({ id: item.id, name: item.name, nomination: email })) }) console.log(result)Una forma bastante sencilla de usar bucles:
let data = [ { "id": 1, "name": "ravi", "nominations": "xyz@gmail.com,abc@gmail.com" }, { "id": 2, "name": "ramu", "nominations": "123@gmail.com,456@gmail.com" } ]; let newData = [] for (let element of data) { let emailIds = element.nominations.split(","); if (emailIds.length > 1) { for (let emailId of emailIds) newData.push({ id: element.id, name: element.name, nominations: emailId }) } } console.log(newData) Explicación : comenzando por atravesar los objetos completos, en cada objeto divide la cadena de nominations y la divide con "," para verificar si hay más de un correo electrónico. Si existe, ejecuta un ciclo para agregarlos individualmente.
Esto podría hacerse con una frase posiblemente larga. La función Object.assign se puede emplear para duplicar el objeto de entrada mientras se cambia la propiedad/propiedades de interés.
let input = [{ id: 1, name: `ravi`, nominations: `xyz@gmail.com, abc@gmail.com` }, { id: 2, name: `ramu`, nominations: `123@gmail.com, 456@gmail.com` }]; let output = input.flatMap(i => i.nominations.split(",").map(n => Object.assign({}, i, { nominations: n.trim() }))); console.log(output);