Básicamente, si tuviera esta matriz:
[{"id" = 1, "product" = "Book"}, {"id" = 1, "product" = "Book"}, {"id" = 1, "product" = "Book"}, {"id" = 2, "product" = "Chair"}]Se convertiría en esta matriz:
[{"id" = 1, "product" = "Book", "count" = 3}, {"id" = 2, "product" = "Chair", "count" = 1}]Estoy usando reaccionar. Otra opción que tengo es agregar la propiedad de recuento al crear y agregar a la matriz para que no se agreguen duplicados, pero tengo curiosidad por saber si hay una manera de hacerlo con una matriz existente.
Editar: si dos productos tienen la misma identificación, son duplicados.
Intenté filtrar la matriz usando la identificación y luego obteniendo el primer objeto. Filtré la matriz nuevamente por id para obtener la longitud. Luego agregué una nueva propiedad "recuento" al primer objeto que es la longitud de la matriz filtrada, luego agregué el primer objeto a una nueva matriz. El problema de hacerlo de esta manera es que tengo que codificar esto para cada identificación posible, incluso si no está incluido en mi matriz.
Puede reducir la matriz a una nueva matriz con la propiedad de count agregada. Se supone que la propiedad id es suficiente para considerar la unicidad. Si el elemento ya se ha visto, incremente el count ; de lo contrario, agregue un nuevo objeto de elemento aumentado.
const data = [{ "id": 1, "product": "Book" }, { "id": 1, "product": "Book" }, { "id": 1, "product": "Book" }, { "id": 2, "product": "Chair" }]; const dedupedData = data.reduce((data, el) => { const index = data.findIndex(item => item.id === el.id); if (index !== -1) { data[index].count++; } else { data.push({ ...el, count: 1 }); } return data; }, []); console.log(dedupedData);Reduzca la matriz a un Map (o incluso a un objeto simple) con clave de id (suponiendo que eso es todo lo que se necesita para identificar un duplicado).
Los valores de ese mapa serán la matriz que buscas.
const arr = [{"id":1,"product":"Book"},{"id":1,"product":"Book"},{"id":1,"product":"Book"},{"id":2,"product":"Chair"}] const zipped = Array.from(arr.reduce((map, o) => { // check if id already registered if (map.has(o.id)) { // increment count map.get(o.id).count++ } else { // otherwise, store the new object with count starting at 1 map.set(o.id, { ...o, count: 1 }) } return map }, new Map()).values()) console.log(zipped) .as-console-wrapper { max-height:100% !important; }