昨天,我遇到了这个面试问题。起初,这看起来相当容易,至少在逻辑上是这样的。但不知怎么的,我无法让它在JavaScript中工作。
这里是一个学生分数的2d数组,学生的名字可能会重复多次。如果是这样的话,将所有分数相加,除以出现的次数以求平均值,必要时执行Math.floor .。
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"]。
到目前为止,我尝试过的都是徒劳的。
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;
}但这行不通。请帮我解释一下逻辑。
发布于 2018-02-20 09:09:20
我会使用一些代码将列表转换为一个哈希映射,这是基于同一个学生的多个数据。
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])
}其结果应该是:
{
"Bobby": ["87"],
"Charles": ["100", "22", "37"],
"Eric": ["65", "49"]
}现在,您可以对对象进行第二次遍历来计算平均值。
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特性可以使它更加优雅,但这将给您提供一个解决方案的想法。
发布于 2018-02-20 09:15:25
您可以首先获得每个人的所有平均值,然后得到临时结果的最高平均值。
如果一个以上的人有相同的分数,所有的人都包括在内。
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);
发布于 2018-02-20 09:18:13
您可以遵循此方法。
reduce在一个分数数组中整理名称的所有分数。map和迭代结果,再用reduce计算分数数组的平均。Demo
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 );
https://stackoverflow.com/questions/48881308
复制相似问题