Ya muestra el porcentaje correcto. Sin embargo, esto es lo que parece:
8.333333333333332 ¿Cómo puedo hacer que se muestre así: 8.33%
Ponerlo dentro de esto causará un error:
acc[key] = (acc[key] || 0) + (1 / totalUsers) * 100.toFixed(2);A continuación se muestran los códigos:
const movies = data.filter(v => v.genre?.selected == "Movie"); const counts = movies.reduce((acc, cur) => { return !cur["1"]?.drama ? acc: Object.entries(cur["1"].drama).reduce((acc, [key,value]) => { if (value) { acc[key] = (acc[key] || 0) + (1 / totalUsers) * 100; } return acc; }, acc) }, {})Esta es una parte de los datos:
const totalUsers = 12 const data = [{ "1": { drama: { Comedy: true, Romance: true, BuddyComedy: false } }, "2": { drama2: { Tragedy: true}, others: "Dystopian", }, id: "zaMR9TR7hNV3p3VFNumyNbXMto93", genre: { selected: "Movie", }, displayName: "p1" }, { "1": { drama: { Tragedy: true, Comedy : true} }, "2": { drama2: { Romance: true} }, id: "zaMR9TR7hNV3p3VFNumyNbXMto93", //sample id genre: { selected: "Movie", }, displayName: "p2" }]Tienes que envolver el 100 entre paréntesis.
Si no lo hace, el intérprete cree que el número es un decimal e intenta analizar el segmento después del punto (" toFixed(2) ") como un número, lo que provoca un error.
En tu caso...
Tendrás que analizar el número usando el Number de números y luego llamar toFixed() :
Number(+(acc[key] || 0) + (1 / totalUsers) * (100)).toFixed(2); Tome nota del operador unario más antes de " (acc[key] || 0) " que se usa para convertirlo en un número, para asegurarse de que no estamos concatenando cadenas. (si no lo agrega, terminará con NaN )
Código de trabajo:
const totalUsers = 12 const data=[{1:{drama:{Comedy:!0,Romance:!0,BuddyComedy:!1}},2:{drama2:{Tragedy:!0},others:"Dystopian"},id:"zaMR9TR7hNV3p3VFNumyNbXMto93",genre:{selected:"Movie"},displayName:"p1"},{1:{drama:{Tragedy:!0,Comedy:!0}},2:{drama2:{Romance:!0}},id:"zaMR9TR7hNV3p3VFNumyNbXMto93",genre:{selected:"Movie"},displayName:"p2"}]; const movies = data.filter(v => v.genre?.selected == "Movie"); const counts = movies.reduce((acc, cur) => { return !cur["1"]?.drama ? acc : Object.entries(cur["1"].drama).reduce((acc, [key, value]) => { if (value) { acc[key] = Number(+(acc[key] || 0) + (1 / totalUsers) * (100)).toFixed(2); } return acc; }, acc) }, {}) console.log(JSON.stringify(counts,0, 2))Pierde precisión si redondea repetidamente el número y lo analiza a lo largo del cálculo. Para preservar la precisión de sus números tanto como sea posible, el redondeo solo debe hacerse una vez después de completar todos los cálculos.
const totalUsers = 12 const data=[{1:{drama:{Comedy:!0,Romance:!0,BuddyComedy:!1}},2:{drama2:{Tragedy:!0},others:"Dystopian"},id:"zaMR9TR7hNV3p3VFNumyNbXMto93",genre:{selected:"Movie"},displayName:"p1"},{1:{drama:{Tragedy:!0,Comedy:!0}},2:{drama2:{Romance:!0}},id:"zaMR9TR7hNV3p3VFNumyNbXMto93",genre:{selected:"Movie"},displayName:"p2"}]; const movies = data.filter(v => v.genre?.selected == "Movie"); const counts = movies.reduce((acc, cur) => { return !cur["1"]?.drama ? acc : Object.entries(cur["1"].drama).reduce((acc, [key, value]) => { if (value) { acc[key] = (acc[key] || 0) + (1 / totalUsers) * 100; } return acc; }, acc) }, {}) const rounded = Object.entries(counts).reduce((acc,[key,value])=>{ return {...acc,[key]:value.toFixed(2)}; },{}); console.log(rounded);acc[key] = ((acc[key] || 0) + (1 / totalUsers) * 100).toFixed(2);
Envuelva todo entre corchetes y luego ponga .toFixed(2)
const movies = data.filter(v => v.genre?.selected == "Movie"); const counts = movies.reduce((acc, cur) => { return !cur["1"]?.sideEffects1 ? acc: Object.entries(cur["1"].drama).reduce((acc, [key,value]) => { if (value) { acc[key] = ((acc[key] || 0) + (1 / totalUsers) * 100).toFixed(2); } return acc; }, acc) }, {})