Tengo una lista de usuarios:
const users = [ { id: 1, name: "Leanne Graham", phone: "1-770-736-8031 x56442", }, { id: 2, name: "Ervin Howell", phone: "010-692-6593 x09125", }, { id: 3, name: "Leanne Graham", phone: "1-463-123-4447", }, { id: 4, name: "Leanne Graham", phone: "493-170-9623 x156", }, { id: 5, name: "Chelsey Dietrich", phone: "(254)954-1289", }, { id: 6, name: "Mrs. Dennis Schulist", phone: "1-477-935-8478 x6430", }, { id: 7, name: "Kurtis Weissnat", phone: "210.067.6132", }, { id: 8, name: "Nicholas Runolfsdottir V", phone: "586.493.6943 x140", }, { id: 9, name: "Glenna Reichert", phone: "(775)976-6794 x41206", }, { id: 10, name: "Leanne Graham", phone: "024-648-3804", }, ]; for (const user of users) { let countUserOccured = users.reduce( (acc, curr) => (acc += curr.name == user.name), 0 ); if (countUserOccured - 1 != 0) { user.name += countUserOccured; } console.log(user); } Y quiero que el nombre de los usuarios sea único. si el nombre, por ejemplo, "Leanne Graham" en ese caso se repite muchas veces, quiero que el primero se agregue a su nombre 1, el segundo a su nombre 2...
Probé este enfoque: pero su orden DESC (desde el mayor número de ocurrencias hasta el más bajo) lo quiero en orden ASCending.
for (const user of users) { let countUserOccured = users.reduce( (acc, curr) => (acc += curr.name == user.name), 0 ); if (countUserOccured - 1 != 0) { user.name += countUserOccured; } console.log(user); }Puede asignar nuevos objetos con un recuento de nombres incrementado. El primer mismo nombre no recibe un número.
const users = [{ id: 1, name: "Leanne Graham", phone: "1-770-736-8031 x56442" }, { id: 2, name: "Ervin Howell", phone: "010-692-6593 x09125" }, { id: 3, name: "Leanne Graham", phone: "1-463-123-4447" }, { id: 4, name: "Leanne Graham", phone: "493-170-9623 x156" }, { id: 5, name: "Chelsey Dietrich", phone: "(254)954-1289" }, { id: 6, name: "Mrs. Dennis Schulist", phone: "1-477-935-8478 x6430" }, { id: 7, name: "Kurtis Weissnat", phone: "210.067.6132" }, { id: 8, name: "Nicholas Runolfsdottir V", phone: "586.493.6943 x140" }, { id: 9, name: "Glenna Reichert", phone: "(775)976-6794 x41206" }, { id: 10, name: "Leanne Graham", phone: "024-648-3804" }], counts = {}, result = users.map(o => ({ ...o, name: o.name + (counts[o.name] ? ++counts[o.name] : (counts[o.name] = 1, '')) })); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }puedes hacer eso con objetos y contando el valor que quieras.
const counts = {}; users.forEach((user) => { counts[user.name] = (counts[user.name] || 0) + 1; }); console.log(counts)Creo que lo que quieres es (agregué un guión bajo antes del índice para mayor claridad):
const userNamesMap = {}; const users = [ { id: 1, name: "Leanne Graham", phone: "1-770-736-8031 x56442", }, { id: 2, name: "Ervin Howell", phone: "010-692-6593 x09125", }, { id: 3, name: "Leanne Graham", phone: "1-463-123-4447", }, { id: 4, name: "Leanne Graham", phone: "493-170-9623 x156", }, { id: 5, name: "Chelsey Dietrich", phone: "(254)954-1289", }, { id: 6, name: "Mrs. Dennis Schulist", phone: "1-477-935-8478 x6430", }, { id: 7, name: "Kurtis Weissnat", phone: "210.067.6132", }, { id: 8, name: "Nicholas Runolfsdottir V", phone: "586.493.6943 x140", }, { id: 9, name: "Glenna Reichert", phone: "(775)976-6794 x41206", }, { id: 10, name: "Leanne Graham", phone: "024-648-3804", }, ].map(user => { if (userNamesMap[user.name]) { user.name += `_${userNamesMap[user.name]++}` } else { userNamesMap[user.name] = 1; } return user; }); console.log(users);