简体   繁体   中英

Get associated Value from range of values in array with a given value in javaScript

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.

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)

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM