Reputation: 67
I am working on a grading system. I want to search through a matching range set of values from the array using a given value and return the associated grade letter from the same array.
This is what I have been able to do so far
var data = [{
"grade_alpha": "A+",
"lower_num": 85,
"upper_num": 100
},
{
"grade_alpha": "A",
"lower_num": 80,
"upper_num": 84
},
{
"grade_alpha": "B+",
"lower_num": 75,
"upper_num": 79
},
{
"grade_alpha": "B",
"lower_num": 70,
"upper_num": 74
},
{
"grade_alpha": "C+",
"lower_num": 65,
"upper_num": 69
},
{
"grade_alpha": "C",
"lower_num": 60,
"upper_num": 64
},
{
"grade_alpha": "D+",
"lower_num": 55,
"upper_num": 59
},
{
"grade_alpha": "D",
"lower_num": 50,
"upper_num": 54
},
{
"grade_alpha": "F",
"lower_num": 0,
"upper_num": 49
}
]
var myArrayNum = [];
var total = 45
var grade = JSON.parse(data);
var myArrayNum = [];
for (var i = 0; i < grade.length; i++) {
myArrayNum[i] = grade[i].upper_num;
if (grade[i].upper_num >= parseFloat(total)) {
var grade_x = grade[i].grade_alpha;
console.log(grade_x);
}
}
So I want grade_x to return F since the total value given 45 is the range of 0 to 49 and the grade_alpha is F.
Upvotes: 0
Views: 118
Reputation: 2872
You can cache data into array and then get grade just by integer key.
This way you won't loop data each time you need get grade.
var data = [
{"grade_alpha":"A+","lower_num":85,"upper_num":100},
{"grade_alpha":"A","lower_num":80,"upper_num":84},
{"grade_alpha":"B+","lower_num":75,"upper_num":79},
{"grade_alpha":"B","lower_num":70,"upper_num":74},
{"grade_alpha":"C+","lower_num":65,"upper_num":69},
{"grade_alpha":"C","lower_num":60,"upper_num":64},
{"grade_alpha":"D+","lower_num":55,"upper_num":59},
{"grade_alpha":"D","lower_num":50,"upper_num":54},
{"grade_alpha":"F","lower_num":0,"upper_num":49}
];
var gradeArray = [];
var initGradeArray = function () {
for (i in data) {
for (var j = data[i].lower_num; j <= data[i].upper_num; j++) {
gradeArray[j] = data[i].grade_alpha;
}
}
};
var getGrade = function (value) {
if ( !gradeArray.length ) {
initGradeArray(); // caching here
}
return gradeArray[value];
};
var grade = getGrade(45);
Upvotes: 0
Reputation: 50291
You can use array filter. In the callback function return the the object which satisfies the condition. This will return array & then get the fist object using index
var data = [{
"grade_alpha": "A+",
"lower_num": 85,
"upper_num": 100
},
{
"grade_alpha": "A",
"lower_num": 80,
"upper_num": 84
},
{
"grade_alpha": "B+",
"lower_num": 75,
"upper_num": 79
},
{
"grade_alpha": "B",
"lower_num": 70,
"upper_num": 74
},
{
"grade_alpha": "C+",
"lower_num": 65,
"upper_num": 69
},
{
"grade_alpha": "C",
"lower_num": 60,
"upper_num": 64
},
{
"grade_alpha": "D+",
"lower_num": 55,
"upper_num": 59
},
{
"grade_alpha": "D",
"lower_num": 50,
"upper_num": 54
},
{
"grade_alpha": "F",
"lower_num": 0,
"upper_num": 49
}
]
var total = 45;
let filtered = data.filter((item) => {
return total >= item.lower_num && total <= item.upper_num;
});
console.log(filtered[0].grade_alpha)
Upvotes: 1