Tengo una matriz de objetos y quiero crear una secuencia basada en cada valor. Por ejemplo, tome la matriz:
let starting_data = [ {str: "a"}, {str: "a"}, {str: "b"}, {str: "c"}, {str: "a"}, {str: "c"}, {str: "a"}, {str: "b"} ] Sé que puedo usar un mapa y reducir para encontrar el número único de cada valor str
let uniques = starting_data.map(function(value) {return value.str;}).reduce((acc, val) => { acc[val] = acc[val] === undefined ? 1 : acc[val] += 1; return acc; }, {})Pero no estoy seguro de cómo aprovechar esto para finalmente obtener lo que quiero como resultado deseado:
let desired_output = [ {str: "a", count: 1}, {str: "a", count: 2}, {str: "b", count: 1}, {str: "c", count: 1}, {str: "a", count: 3}, {str: "c", count: 2}, {str: "a", count: 4}, {str: "b", count: 2} ] Donde los conteos comienzan de nuevo para cada valor único, pero a s van a 4, y b y c van a 2. Intenté jugar con arr.sort si necesito hacer eso primero pero no estaba seguro de cómo ordenar según en un valor dentro de un objeto... Cualquier ayuda apreciada!!
puede hacer algo como mantener un objeto separado para realizar un seguimiento de los recuentos
let starting_data = [ {str: "a"}, {str: "a"}, {str: "b"}, {str: "c"}, {str: "a"}, {str: "c"}, {str: "a"}, {str: "b"} ] let counts = {}; let res = starting_data.map(({str}) => { if(!counts[str])counts[str]=0; counts[str]+=1 return {str,count:counts[str]} }) console.log(res)Lo mencionaste, quieres que sea puramente funcional, así que aquí está.
let starting_data = [ { str: "a" }, { str: "a" }, { str: "b" }, { str: "c" }, { str: "a" }, { str: "c" }, { str: "a" }, { str: "b" }, ]; const uniqueCount = starting_data .reduce( (arr, { str }) => { const hash = arr[0]; hash[str] ||= 0; arr.push({ str, count: ++hash[str] }); return arr; }, [{}] ) .slice(1); console.log(uniqueCount);Esto imprime:
[ { str: 'a', count: 1 }, { str: 'a', count: 2 }, { str: 'b', count: 1 }, { str: 'c', count: 1 }, { str: 'a', count: 3 }, { str: 'c', count: 2 }, { str: 'a', count: 4 }, { str: 'b', count: 2 } ] Esta solución mantiene un hash como el primer elemento de la matriz que construye reduce .
[{}] .0 si la clave aún no existe.str y un count .hash[str] se incrementa en 1 y luego se usa como valor.La matriz ahora se ve así:
[{ a: 1 }, { str: "a", count: 1 }] [ { a: 2 }, { str: 'a', count: 1 }, { str: 'a', count: 2 } ] [ { a: 2, b: 1 }, { str: 'a', count: 1 }, { str: 'a', count: 2 }, { str: 'b', count: 1 } ] // Continues until it finishesEspero que esto ayude.