JavaScript中如何获取average函数返回结果的前5个最大值
实现提取前5个最大平均值的方案
没问题,咱们一步步改造代码,实现提取前5个最大平均值的功能,逻辑很清晰:
第一步:收集跑步者与对应平均值的关联数据
不能只打印平均值,得把每个跑步者和他的平均值绑定起来存好——这样排序后还能知道对应是谁的成绩,用map方法就能简洁完成这个操作。
第二步:按平均值降序排序
把收集到的数据按平均值从大到小排序,用比较函数指定降序规则就行。
第三步:提取前5个最大值
用slice方法截取排序后的前5项,如果跑步者总数不足5个,它会自动返回所有现有数据,不用额外处理边界情况。
完整修改后的代码
Person.prototype.average = function(){ var plus=0; for (var i = 0; i < this.kilometers.length; i++) { plus += this.kilometers[i]; } var total= plus/this.kilometers.length; return total; }; function myFunction(runners) { // 1. 收集每个跑步者及其对应的平均值 var runnerWithAvg = runners.map(runner => ({ person: runner, average: runner.average() })); // 2. 按平均值从大到小排序 runnerWithAvg.sort((a, b) => b.average - a.average); // 3. 提取前5个最大值对应的跑步者数据 var top5Runners = runnerWithAvg.slice(0, 5); // 示例:打印前5名的信息,也可以直接返回结果数组 top5Runners.forEach((item, index) => { console.log(`第${index+1}名:${item.person.name},平均公里数:${item.average.toFixed(2)}`); }); // 如果只需要前5个平均值的数组,可改为: // var top5Avgs = top5Runners.map(item => item.average); // return top5Avgs; } // 补充你代码里未完整定义的Person构造函数 function Person(name, gender, age, kilometers) { this.name = name; this.gender = gender; this.age = age; this.kilometers = kilometers; } // 示例数据 var runners = [ new Person('Alex', 'male', '25', [4, 3, 3, 3]), new Person('Bob', 'male', '30', [5, 5, 4, 6]), new Person('Cindy', 'female', '28', [3, 4, 4, 5]), new Person('Dave', 'male', '22', [6, 6, 7, 5]), new Person('Eve', 'female', '26', [4, 5, 5, 4]), new Person('Frank', 'male', '32', [3, 3, 4, 3]) ]; myFunction(runners);
代码细节说明
map方法遍历所有跑步者,生成包含跑步者对象和对应平均值的新数组,方便后续关联数据;sort((a,b) => b.average - a.average)是降序排序的核心,要是需要升序,改成a.average - b.average就行;slice(0,5)安全截取前5项,哪怕数组长度不足5也不会报错;toFixed(2)是让平均值保留两位小数,看起来更规整,不需要的话直接删掉就行。
内容的提问来源于stack exchange,提问作者Alex Dis
相关产品推荐
相关产品推荐

