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)
但这不起作用.请帮助我并解释逻辑.
我会使用一些代码将列表转换为哈希映射,因为可能有多个同一个学生.
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功能使它更优雅,但这应该让你了解一个解决方案.
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |