tengo una matriz como
const arr = [ {id: '1', name: 'name 1', age: 20}, {id: '2', name: 'name 2', age: 21}, {id: '2', name: 'name 3', age: 22}, {id: '2', name: 'name 4', age: 23}, {id: '3', name: 'name 5', age: 24}, {id: '3', name: 'name 6', age: 25}, {id: '4', name: 'name 7', age: 26}, {id: '5', name: 'name 8', age: 27}, {id: '5', name: 'name 9', age: 28}, {id: '5', name: 'name 10', age: 29}, ];Sé que tengo duplicados (buscando solo la propiedad de identificación) en la matriz y no quiero eliminar los duplicados en su lugar, necesito agregar algo para diferenciar.
arr = [ {id: '1_0', name: 'name 1', age: 20}, {id: '2_0', name: 'name 2', age: 21}, {id: '2_1', name: 'name 3', age: 22}, {id: '2_2', name: 'name 4', age: 23}, {id: '3_0', name: 'name 5', age: 24}, {id: '3_1', name: 'name 6', age: 25}, {id: '4_0', name: 'name 7', age: 26}, {id: '5_0', name: 'name 8', age: 27}, {id: '5_1', name: 'name 9', age: 28}, {id: '5_2', name: 'name 10', age: 29}, ];Gracias por adelantado.
Podría tomar un objeto para contar y mapear nuevos objetos con subversiones.
Esta respuesta presenta un cierre.
(ids => o => ({ ...o, id: `${o.id}_${ids[o.id] ??= 0, ids[o.id]++}` })) ({})donde la función se llama con un objeto y devuelve otra función
o => ({ ...o, id: `${o.id}_${ids[o.id] ??= 0, ids[o.id]++}` })para el mapeo.
La función de mapeo devuelve un nuevo objeto con un reemplazo de la propiedad id con parte de la id anterior y un nuevo valor que comienza con cero para cualquier id no vista.
const array = [{ id: '1', name: 'name 1', age: 20 }, { id: '2', name: 'name 2', age: 21 }, { id: '2', name: 'name 3', age: 22 }, { id: '2', name: 'name 4', age: 23 }, { id: '3', name: 'name 5', age: 24 }, { id: '3', name: 'name 6', age: 25 }, { id: '4', name: 'name 7', age: 26 }, { id: '5', name: 'name 8', age: 27 }, { id: '5', name: 'name 9', age: 28 }, { id: '5', name: 'name 10', age: 29 }], result = array.map( (ids => o => ({ ...o, id: `${o.id}_${ids[o.id] ??= 0, ids[o.id]++}` })) ({}) ); console.log(result); .as-console-wrapper { max-height:100% !important; }1) Puede lograr fácilmente el resultado usando Map
const arr = [ { id: "1", name: "name 1", age: 20 }, { id: "2", name: "name 2", age: 21 }, { id: "2", name: "name 3", age: 22 }, { id: "2", name: "name 4", age: 23 }, { id: "3", name: "name 5", age: 24 }, { id: "3", name: "name 6", age: 25 }, { id: "4", name: "name 7", age: 26 }, { id: "5", name: "name 8", age: 27 }, { id: "5", name: "name 9", age: 28 }, { id: "5", name: "name 10", age: 29 }, ]; const map = new Map(); arr.forEach((o) => map.has(o.id) ? map.get(o.id).push(o) : map.set(o.id, [o])); const result = []; for (let [, arr] of map) { arr.forEach((o, i) => result.push({ ...o, id: `${o.id}_${i}` })); } console.log(result); /* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; } 2) También puede usar aquí mapa con Mapa (Gracias a VLAZ )
const arr = [ { id: "1", name: "name 1", age: 20 }, { id: "2", name: "name 2", age: 21 }, { id: "2", name: "name 3", age: 22 }, { id: "2", name: "name 4", age: 23 }, { id: "3", name: "name 5", age: 24 }, { id: "3", name: "name 6", age: 25 }, { id: "4", name: "name 7", age: 26 }, { id: "5", name: "name 8", age: 27 }, { id: "5", name: "name 9", age: 28 }, { id: "5", name: "name 10", age: 29 }, ]; const map = new Map(); const result = arr.map((curr) => { map.set(curr.id, (map.get(curr.id) ?? -1) + 1); return { ...curr, id: `${curr.id}_${map.get(curr.id)}` }; }); console.log(result); /* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }Se necesita una sola iteración:
const arr = [ {id: '1', name: 'name 1', age: 20}, {id: '2', name: 'name 2', age: 21}, {id: '2', name: 'name 3', age: 22}, {id: '2', name: 'name 4', age: 23}, {id: '3', name: 'name 5', age: 24}, {id: '3', name: 'name 6', age: 25}, {id: '4', name: 'name 7', age: 26}, {id: '5', name: 'name 8', age: 27}, {id: '5', name: 'name 9', age: 28}, {id: '5', name: 'name 10', age: 29}, ]; //keep track of how many times each id has been encountered const counterPerRecord = new Map(); for (const record of arr) { //get count or default to zero const next = counterPerRecord.get(record.id) ?? 0; //update the count for next time we encounter the id counterPerRecord.set(record.id, next+1); //update the id record.id += `_${next}`; } console.log(arr); .as-console-wrapper { max-height:100% !important; } Solo necesita un mapa para realizar un seguimiento de cuál es la próxima instancia para el próximo número que se agregará a cada propiedad de id . La primera vez es cero, y aumenta cada vez que encuentra la misma id .