首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JavaScript 2d系列学生得分中找到最高平均值

在JavaScript 2d系列学生得分中找到最高平均值
EN

Stack Overflow用户
提问于 2018-02-20 09:01:38
回答 7查看 3.1K关注 0票数 0

昨天,我遇到了这个面试问题。起初,这看起来相当容易,至少在逻辑上是这样的。但不知怎么的,我无法让它在JavaScript中工作。

这里是一个学生分数的2d数组,学生的名字可能会重复多次。如果是这样的话,将所有分数相加,除以出现的次数以求平均值,必要时执行Math.floor .

代码语言:javascript
复制
var arr = [
    ["Bobby","87"],
    ["Charles","100"],
    ["Eric","65"],
    ["Charles","22"],
    ["Charles","37"],
    ["Eric","49"]]

所以,Charles的平均分数是Math.floor((100+22+37)/3) = 53,对Eric来说是Math.floor((65+49)/2) = 57

因此,平均水平最高的是["Bobby","87"]

到目前为止,我尝试过的都是徒劳的。

代码语言:javascript
复制
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;
}

但这行不通。请帮我解释一下逻辑。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-02-20 09:09:20

我会使用一些代码将列表转换为一个哈希映射,这是基于同一个学生的多个数据。

代码语言:javascript
复制
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])
}

其结果应该是:

代码语言:javascript
复制
{
    "Bobby": ["87"],
    "Charles": ["100", "22", "37"],
    "Eric": ["65", "49"]
}

现在,您可以对对象进行第二次遍历来计算平均值。

代码语言:javascript
复制
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);

我相信,使用ES6特性可以使它更加优雅,但这将给您提供一个解决方案的想法。

票数 5
EN

Stack Overflow用户

发布于 2018-02-20 09:15:25

您可以首先获得每个人的所有平均值,然后得到临时结果的最高平均值。

如果一个以上的人有相同的分数,所有的人都包括在内。

代码语言:javascript
复制
var array = [["Bobby", "87"], ["Charles", "100"], ["Eric", "65"], ["Charles", "22"], ["Charles", "37"], ["Eric", "49"]],
    highest = array
        .reduce(function (r, a) {
            var i = r.findIndex(b => a[0] === b[0]);
            if (i !== -1) {
                r[i][1] = (r[i][1] * r[i][2] + +a[1]) / ++r[i][2];
            } else {
                r.push(a.concat(1));
            }
            return r;
        }, [])
        .reduce(function (r, a, i) {
            if (!i || r[0][1] < a[1]) {
                return [a.slice(0, 2)];
            }
            if (r[0][1] === a[1]) {
                r.push(a.slice(0, 2));
            }
            return r;
        }, []);

console.log(highest);

票数 0
EN

Stack Overflow用户

发布于 2018-02-20 09:18:13

您可以遵循此方法。

  • 使用reduce在一个分数数组中整理名称的所有分数。
  • 迭代,用map迭代结果,再用reduce计算分数数组的平均

Demo

代码语言:javascript
复制
var fnSumAvgArray = (arr) => arr.reduce( ( a, c ) => a + c, 0 )/arr.length;

var arr = [
    ["Bobby","87"],
    ["Charles","100"],
    ["Eric","65"],
    ["Charles","22"],
    ["Charles","37"],
    ["Eric","49"]];
var output = Object.values( arr.reduce( (a,c) => ( 
     a[c[0]] = (a[c[0]] || { name : c[0], scores : [] }), //check if accumulator already has been initialized for this name or else intialize
     a[ c[ 0 ] ].scores.push ( +c[1] ),  //push the score into the name based score array
     a ) , {}) ) //return  the accumulator
.map( s => ( 
     s.avg = fnSumAvgArray(s.scores),  s 
));
      
console.log( output );

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48881308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档