Considere los siguientes objetos:
// Example 1 { gradeA: 100, gradeB: 'No-Data', gradeC: 'No-Data' } // Example 2 { gradeA: 50, gradeB: 40, gradeC: 'No-Data' } // Example 3 { gradeA: 75, gradeB: 'No-Data', gradeC: 'No-Data' } Representan un porcentaje, es decir, la suma de las tres notas será exactamente 100. ¿Cómo podemos interpolar las claves con 'No-Data' siempre que se puedan calcular sus valores?
Resultados previstos:
// Example 1 { gradeA: 100, gradeB: 0, gradeC: 0 } // Example 2 { gradeA: 50, gradeB: 40, gradeC: 10 } // Example 3 { gradeA: 75, gradeB: 'No-Data', gradeC: 'No-Data' } // Note: This one can't be figured out so we leave it as is.Mi solución en pseudocódigo:
function interpolate(obj) { // If only one key is a number: // The value is 100: // Set the other two keys to 0 and return the obj. // The value is less than 100: // return obj unchanged. // If only one key is not a number: // set that key to the sum of the two numbers minus 100 and return the obj. }Hay dos preguntas principales aquí:
'No-Data'.En realidad, estos Objetos están dentro de una Matriz, pero estoy seguro de que puedo resolver eso por mí mismo.
Usando la misma lógica que has descrito:
function interpolate(obj) { var noData = 0; Object.keys(obj).forEach(key => { if (isNaN(obj[key])) { noData++; } }); var sum = 0; var missingKey; if (noData == 1) { Object.keys(obj).forEach(key => { if (!isNaN(obj[key])) { sum += obj[key]; } else { missingKey = key; } }); obj[missingKey] = 100 - sum; return obj } return obj; } var objects = [{ gradeA: 100, gradeB: 'No-Data', gradeC: 'No-Data' }, { gradeA: 50, gradeB: 40, gradeC: 'No-Data' }, { gradeA: 75, gradeB: 'No-Data', gradeC: 'No-Data' }] objects.forEach(o => console.log(interpolate(o)));No-Data ). let keys = Object.keys(obj).filter(k=>obj[k]===value);
Simplemente cuente la cantidad de elementos en la matriz para ver cuántos tiene.
No-Data . Consejo: si está tratando de ser lo más eficiente posible, no necesita seguir encontrando ocurrencias de No-Data después de encontrar 2 :)PD. Hay algunos problemas con el otro código que se publicó que probablemente le impedirán obtener todos los puntos si lo entrega :)
En mi solución, analizo cada objeto para la suma combinada de las calificaciones y la cantidad de valores Sin datos. Luego procedo a reemplazar los valores No-Data en cada propiedad de cada objeto si las condiciones coinciden. Funciona con cualquier número de grados.
const objects = [{ gradeA: 100, gradeB: 'No-Data', gradeC: 'No-Data' }, { gradeA: 50, gradeB: 40, gradeC: 'No-Data' }, { gradeA: 75, gradeB: 'No-Data', gradeC: 'No-Data' }]; const analysis = objects .map( o => Object.values(o) .reduce( ([o, sum, nodatacount], v) => v==='No-Data' ? [o, sum, nodatacount+1] : [o, sum+v, nodatacount], [o, 0, 0] ) ); for(const [o, sum, nodatacount] of analysis) { if(sum === 100 || nodatacount === 1) { for(const [key, _] of Object.entries(o) .filter(([_, value]) => value==='No-Data') ) { o[key] = 100-sum; } } } console.log( objects ); .as-console-wrapper {top:0; max-height: 100% !important}