Tengo una matriz como esta:
var clients=[{"id":1,"name":"john","age":20}, {"id":3,"name":"dean","age":23}, {"id":12,"name":"harry","age":14}, {"id":1,"name":"sam","age":22}, {"id":13,"name":"Bolivia","age":16}, {"id":7,"name":"sabi","age":60}, {"id":7,"name":"sahra","age":40}, {"id":4,"name":"natie","age":53},{"id":7,"name":"many","age":22}]Quiero encontrar los objetos duplicados y agruparlos así:
[ { "id":1, "clients":[ {"id":1,"name":"john","age":20}, {"id":1,"name":"sam","age":22} ] }, { "id":7, "clients":[ {"id":7,"name":"sabi","age":60}, {"id":7,"name":"sahra","age":40}, {"id":7,"name":"many","age":22} ] } ] ¿puedo hacer eso con filter() como este: clients.reduce(//code hier) ?
reduce() está hecho a medida para esto. Cuando desee agregar una matriz y obtener un resultado calculado, debe usar reduce() .
find() es otro método de matriz, que ayuda a encontrar un elemento de matriz basado en una condición (aquí la coincidencia de la propiedad id).
var clients=[{"id":1,"name":"john","age":20}, {"id":3,"name":"dean","age":23}, {"id":12,"name":"harry","age":14}, {"id":1,"name":"sam","age":22}, {"id":13,"name":"Bolivia","age":16}, {"id":7,"name":"sabi","age":60}, {"id":7,"name":"sahra","age":40}, {"id":4,"name":"natie","age":53},{"id":7,"name":"many","age":22}] let ans = clients.reduce((agg,x,index) => { let findI = agg.find( a => a.id === x.id ); if(findI) findI.clients.push(x); else { agg.push({ id : x.id, clients : [x] }); } return agg; },[]); console.log(ans);La solución más simple sería recorrer los clients y buscar un objeto existente con la misma id . En caso afirmativo, empuje a la matriz de clients . O bien, simplemente crea uno.
var clients = [{ "id": 1, "name": "john", "age": 20 }, { "id": 3, "name": "dean", "age": 23 }, { "id": 12, "name": "harry", "age": 14 }, { "id": 1, "name": "sam", "age": 22 }, { "id": 13, "name": "olivia", "age": 16 }, { "id": 7, "name": "sabi", "age": 60 }, { "id": 7, "name": "sahra", "age": 40 }, { "id": 4, "name": "natie", "age": 53 }, { "id": 7, "name": "kany", "age": 22 }] const groups = []; for (let client of clients) { const existingGroup = groups.find(group => group.id == client.id) if (existingGroup) existingGroup.clients.push(client); else { groups.push({ id: client.id, clients: [client] }); } } console.log(groups);Puede reasignar el objeto original con el objeto temporal que acaba de usar para esto y continuar con su lógica comercial, que creo que es la que está buscando.