找到JavaScript 2d学生得分中的最高平均值

Str*_*der 0 javascript multidimensional-array

昨天,我遇到了这个面试问题.最初,它似乎很容易,至少在逻辑上.但不知何故,我无法在JavaScript中使用它.

这是一个2d的学生成绩数组,学生姓名可能会重复多次.如果是这种情况,请将所有得分相加并除以出现次数以找到平均值,如有必要,请执行Math.floor.

var arr = [
    ["Bobby","87"],
    ["Charles","100"],
    ["Eric","65"],
    ["Charles","22"],
    ["Charles","37"],
    ["Eric","49"]]
Run Code Online (Sandbox Code Playgroud)

所以,Charles平均分数是Math.floor((100+22+37)/3) = 53 和,因为Eric它会Math.floor((65+49)/2) = 57.

所以平均值最高["Bobby","87"].

到目前为止,我一直没有尝试过......

var op_arr = [];
arr.each(function(item) {
    var sum = 0;
    var itemCount = 1;
    var checkFlag = isItemInArray(arr,item);
    if(checkFlag) {
        itemCount++;
        sum += item[1];
    }
});
function isItemInArray(array,item) {
    for(let i = 0;i < array.length; i++) {
        if(array[i][0] === item[0]) {
            return array[i];
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.请帮助我并解释逻辑.

Eli*_*son 5

我会使用一些代码将列表转换为哈希映射,因为可能有多个同一个学生.

var arr = [
    ["Bobby","87"],
    ["Charles","100"],
    ["Eric","65"],
    ["Charles","22"],
    ["Charles","37"],
    ["Eric","49"]
];

var scores = {};

for (var i = 0; i < arr.length; i++) {
    var student = arr[i];

    if (!scores.hasOwnProperty(student[0]))
        scores[student[0]] = []

    scores[student[0]].push(student[1])
}
Run Code Online (Sandbox Code Playgroud)

结果应该是:

{
    "Bobby": ["87"],
    "Charles": ["100", "22", "37"],
    "Eric": ["65", "49"]
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以对对象进行第二次传递以计算平均值

for (var key in scores) {
    if (!scores.hasOwnProperty(key)) continue;

    var total = scores[key].reduce(function(next, cur) { 
        return next + parseInt(cur);
    }, 0);

    scores[key] = Math.floor(total / scores[key].length);
}

console.log(scores);
Run Code Online (Sandbox Code Playgroud)

我相信你可以使用ES6功能使它更优雅,但这应该让你了解一个解决方案.