Consider the following Objects:
// 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'
}
They represent a percentage, i.e. the sum of all three grades will be exactly 100. How can we interpolate the keys with 'No-Data' whenever their values can be calculated?
Expected Results:
// 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.
My solution in pseudo-code:
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.
}
There are two main questions here:
- How do I find out how many and which keys are
'No-Data'. - Can I rearrange the control flow to be more efficient?
In reality, these Objects are inside an Array, but I’m sure I can figure that stuff out myself.
Advertisement
Answer
- You can use something like this to filter for a key given a value (in your case
No-Data).
let keys = Object.keys(obj).filter(k=>obj[k]===value);
Just count the number of items in the array to see how many you have.
- Your control flow is fine, it will be readable and its efficiency depends on how efficient you are at counting the number of occurances of
No-Data. Tip: If you are trying to be as efficient as possible, you don’t need to keep finding occurrences ofNo-Dataafter you find 2 🙂
Ps. There are a few issues with the other code that was posted that will probably stop you from getting full points if you turn it in 🙂