Me gustaría contar todos los valores donde aparece una letra primero y devolver la letra con al menos la mitad de todos los valores en mi objeto, por ejemplo, asumo que tengo un objeto como este
const sample = { "A,B,C": 4, "B,C,A": 3, "C,B,A": 2, "A,C,B": 2 };Devolvería A porque si cuenta todos los valores donde aparece A primero, obtendría 6 (4+2)
Esto es lo que tengo actualmente:
for (let votes of Object.values(sample)) { sum += votes } stretchWin = Math.round(sum / 2) winner = Object.entries(sample) .filter(([, val]) => val >= stretchWin) .map(([keys]) => keys)Con esto obtengo una matriz vacía porque no estoy contando todos los valores asignados a A
Itere sobre toda la muestra primero para obtener una suma de los valores por la primera letra primero, luego itere sobre ese nuevo objeto para identificar qué valores coinciden con el objetivo de la mitad del total.
const sample = { "A,B,C": 4, "B,C,A": 3, "C,B,A": 2, "A,C,B": 2 }; const sumByChar = {}; for (const [key, value] of Object.entries(sample)) { const char = key[0]; sumByChar[char] = (sumByChar[char] ?? 0) + value; } let sum = 0; for (let votes of Object.values(sample)) { sum += votes } const targetSum = Math.round(sum / 2); const winners = Object.entries(sumByChar) .filter(([, val]) => val >= targetSum) .map(([key]) => key); console.log(winners);No estoy completamente seguro de lo que quiere decir cuál debería ser el resultado. Si te entiendo bien quieres algo como esto??
const sample = { "A,B,C": 4, "B,C,A": 3, "C,B,A": 2, "A,C,B": 2 }; const totalSum = Object.values(sample).reduce( (previousValue, currentValue) => previousValue + currentValue, 0 ); const stretchWin = Math.round(totalSum / 2); const winner = Object.entries(sample) .filter(([key, value]) => { const isFirstLetterA = key.startsWith("A"); return isFirstLetterA || value >= stretchWin; }) .map(([key, value]) => value) .reduce((previousValue, currentValue) => previousValue + currentValue, 0); console.log(winner);