Tengo un diccionario ordenado con cierto número de entradas:
dict = {B:3, A:2, C:2, D:1, E:0, F:0...}Después de filtrar el diccionario para obtener solo las entradas con los 3 valores más altos:
result = Object.fromEntries(Object .entries(dict) .sort(([, a], [, b]) => b - a) .filter((s => ([, v]) => s.add(v).size <= 3)(new Set)) );El diccionario actual es
{"B": 3, "A": 2, "C": 2, "D": 1} Entonces, estoy tratando de agregar 4 a los valores más grandes, 2 a los segundos valores más grandes y 1 a los terceros valores más grandes, ¿cuáles son las formas de hacer esto?
El resultado esperado: {"B": 7, "A": 4, "C": 4, "D": 2}
Una de las formas en las que puedo pensar es:
for (const key of Object.keys(result)) { // if result[key] largest //plus 4 // if result[key] second largest //plus 2 // else //plus 1 }Gracias por leer..
Puedes hacer esto usando Map y flatMap como:
const dict = { B: 3, A: 2, C: 2, D: 1, E: 0, F: 0 }; const valuesToAdd = [4, 2, 1]; const result = Object.fromEntries([ ...Object.entries(dict) .sort(([, a], [, b]) => b - a) .filter( ( (s) => ([, v]) => s.add(v).size <= 3 )(new Set()) ) .reduce((map, arr) => { const [k, v] = arr; map.has(v) ? map.get(v).push(arr) : map.set(v, [arr]); return map; }, new Map()) .values(), ].flatMap((arr, i) => arr.map(([k, v]) => [k, v + valuesToAdd[i]])) ); console.log(result);