得分最大的JavaScript返回数组项

得分最大的JavaScript返回数组项,javascript,arrays,Javascript,Arrays,我有以下数组: var arr = [ ['Math', 'John', 100], ['Math', 'Jake', 89], ['Math', 'Amy', 93], ['Science', 'Jake', 89], ['Science', 'John', 89], ['Science', 'Amy', 83], ['English', 'John', 82], ['English', 'Amy', 81],

我有以下数组:

var arr = [
    ['Math', 'John', 100], 
    ['Math', 'Jake', 89], 
    ['Math', 'Amy',  93],
    ['Science', 'Jake', 89],
    ['Science', 'John', 89],
    ['Science', 'Amy',  83],
    ['English', 'John',  82],
    ['English', 'Amy',  81],
    ['English', 'Jake',  72]
]

let topScore = Math.max.apply(Math, arr.map(function (o) {
 return o[2];
}))

console.log(topScore);
我能够从列表中获得最高分数,但我需要的结果是:

[ 
  { "Subject": "Math", 
    "Top": [
             { Name: "John", Score: 100}
           ]
  },
  { "Subject": "Science", 
    "Top": [
             { Name: "Jake", Score: 89},
             { Name: "John", Score: 89}
           ]
  },
  { "Subject": "English", 
    "Top": [
             { Name: "John", Score: 82}
           ]
  }
]
我在做什么:

首先获取所有主题:

var allSubj = [];

  arr.forEach(function(item) {
    let subj = item[0];
    allSubj .push(subj);
  });
var uniqueSubjects = arr .filter((v, i, a) => a.indexOf(v) === i);
获取独特主题:

var allSubj = [];

  arr.forEach(function(item) {
    let subj = item[0];
    allSubj .push(subj);
  });
var uniqueSubjects = arr .filter((v, i, a) => a.indexOf(v) === i);
在获得唯一的主题之后,我的下一步是按每个主题过滤数组

uniqueSubjects.forEach(function (subj) {
  var arrStudentsBySubject = []
  arr.forEach(function (student) {
    if (student[0] === subj) {
      arrStudentsBySubject.push(student)
    }
  })
})
我的计划是迭代所有唯一的主题,然后对于每个唯一的主题,在原始arr列表上再次迭代。我想一定有更好的办法


谢谢。

您可以拿一个对象进行分组,然后检查分数是否大于或等于

var数组=[[Math'、'John',100]、'Math'、'Jake',89]、'Math'、'Amy',93]、'Science'、'Jake',89]、'Science'、'John',89]、'Science'、'Amy',83]、'English'、'John',82]、'English'、'Amy',81]、'English'、'Jake',72,
topScore=Object.values(array.reduce((r[Subject,Name,Score])=>{
如果(!r[Subject])r[Subject]={Subject,Top:[{Name,Score}]};
else if(r[Subject].Top[0].Score

.as console wrapper{max height:100%!important;top:0;}
您可以选择一个对象进行分组,并检查分数是否大于或等于

var数组=[[Math'、'John',100]、'Math'、'Jake',89]、'Math'、'Amy',93]、'Science'、'Jake',89]、'Science'、'John',89]、'Science'、'Amy',83]、'English'、'John',82]、'English'、'Amy',81]、'English'、'Jake',72,
topScore=Object.values(array.reduce((r[Subject,Name,Score])=>{
如果(!r[Subject])r[Subject]={Subject,Top:[{Name,Score}]};
else if(r[Subject].Top[0].Score

.as console wrapper{max height:100%!important;top:0;}
要按主题对结果进行分组,请创建一个对象,其键为主题名称。对象包含每个科目的当前最高分;当你得到一个更高的分数时,你就替换它

var-arr=[
[Math',John',100],
['Math','Jake',89],
['Math','Amy',93],
['Science','Jake',89],
[“科学”,“约翰”,89],
['Science','Amy',83],
['English','John',82],
['English','Amy',81],
['English','Jake',72]
];
设obj={};
arr.forEach(([科目、姓名、分数])=>{
obj[主题]=obj[主题]| |{
主题:主题,,
顶部:[],
上核:0
};
如果(分数>目标[科目].上核){
obj[主题]。顶部=[{
姓名:姓名,,
分数:分数
}];
obj[受试者]。topscore=得分;
}否则如果(分数==obj[主题].topscore){
obj[subject].Top.push({
姓名:姓名,,
分数:分数
})
}
});
让结果=对象值(obj);

控制台日志(结果)要按主题对结果进行分组,请创建一个对象,其键为主题名称。对象包含每个科目的当前最高分;当你得到一个更高的分数时,你就替换它

var-arr=[
[Math',John',100],
['Math','Jake',89],
['Math','Amy',93],
['Science','Jake',89],
[“科学”,“约翰”,89],
['Science','Amy',83],
['English','John',82],
['English','Amy',81],
['English','Jake',72]
];
设obj={};
arr.forEach(([科目、姓名、分数])=>{
obj[主题]=obj[主题]| |{
主题:主题,,
顶部:[],
上核:0
};
如果(分数>目标[科目].上核){
obj[主题]。顶部=[{
姓名:姓名,,
分数:分数
}];
obj[受试者]。topscore=得分;
}否则如果(分数==obj[主题].topscore){
obj[subject].Top.push({
姓名:姓名,,
分数:分数
})
}
});
让结果=对象值(obj);


控制台日志(结果)按分数对数组排序,然后返回第一个元素。按分数对数组排序,然后返回第一个元素只能得到分数为100的John的科学。如果要按值对结果进行分组,请使用键为这些值的对象。我的初始数组中没有键。按分数对数组排序,然后返回第一个元素。按分数对其排序,然后返回第一个元素只会为John生成分数为100的科学。如果要按值对结果进行分组,请使用键为这些值的对象。我的初始数组中没有键。这仅显示每个主题的一个最高分数。科学有两个得分最高的人。不,没有。艾米的分数比杰克和约翰高。我的错。我把分数搞混了。我修改了问题,您的答案仍然提供了相关的结果。当我更改输入时,我得到了所需的结果。这只显示每个主题的一个最高分数。科学有两个得分最高的人。不,没有。艾米的分数比杰克和约翰高。我的错。我把分数搞混了。我修改了问题,您的答案仍然提供了相关的结果。当我更改输入时,我得到了所需的结果。脚本上有一个错误。数组后的逗号使topScore声明无效。@Chett否,它不起作用。您可以在同一个
let
语句中声明多个变量,您可以用逗号分隔它们。脚本上有一个错误。数组后的逗号使topScore声明无效。@Chett否,它不起作用。您可以在同一
let
语句中声明多个变量,并用逗号分隔它们。