恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
freeCodeCamp 每日编程挑战解析:Challenge 274 Oldest Person 找出年龄最大的人
首页
资讯中心
/
freeCodeCamp 每日编程挑战解析:Challenge 274 Oldest Person 找出年龄最大的人
freeCodeCamp 每日编程挑战解析:Challenge 274 Oldest Person 找出年龄最大的人
发布时间:2026/9/11 5:32:15
freeCodeCamp 每日编程挑战解析Challenge 274 Oldest Person 找出年龄最大的人【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp本篇技术指南以 freeCodeCamp 开源课程仓库中 daily-coding-challenges-javascript 板块的第 274 道题 Oldest Person 为核心完整还原题目要求、全部测试用例与官方参考解法并结合 JavaScript 数组高阶方法逐一剖析实现原理。读完本文你将掌握基于对象数组做极值筛选并保持输入顺序这一类数据加工题的标准解题思路并理解 freeCodeCamp 挑战仓库中--hints--、--seed--、--solutions--三大区块是如何协同工作的。挑战背景每日编程挑战体系这道题隶属于 freeCodeCamp 课程库中的daily-coding-challenges-javascript板块。从板块结构配置 daily-coding-challenges-javascript.json 可以看到这是一个包含 365 道题的 JavaScript 每日挑战系列对应一年的每一天题目编号从 Challenge 1 Vowel Balance 一直到 Challenge 365 The Last Challenge: Bucket Fill 3。该板块的配置字段challengeType: 28、usesMultifileEditor: true、helpCategory: JavaScript表明这类题目在 Learn 平台上以内置代码编辑器 自动断言测试的方式运行。学习者需要补全--seed--中给出的函数骨架让实现通过--hints--中全部断言才算通关。Oldest Person 正是这一系列中编号 274 的题目位于 Challenge 273 ISBN-13 Validator 与 Challenge 275 Character Frequency 之间属于数组与对象处理类题目的进阶练习。题目要求从对象数组中找出年龄最大者原题描述如下给定一个对象数组每个对象带有name和age两个属性返回一个包含年龄最大者姓名的数组。如果多人共享最大年龄则按它们在输入中出现的顺序全部返回。这道题考察三个核心点对象数组的字段读取从每个元素中取出age属性。极值计算找出所有年龄中的最大值。条件过滤与顺序保持筛选出年龄等于最大值的对象取出其name且必须保持输入顺序——这意味着不能对原数组进行排序后取头部因为排序会破坏平局时的原始顺序。注意返回类型是数组而非单个字符串即使只有一位年龄最大者也要以[Brenda]形式返回。这是很容易被忽略的细节也是测试断言assert.deepEqual严格校验的。官方参考解法逐行拆解仓库中--solutions--区块给出的官方参考实现如下function getOldest(people) { const maxAge Math.max(...people.map(p p.age)); return people.filter(p p.age maxAge).map(p p.name); }这段代码只有两行却完整利用了 JavaScript 数组的三个高阶工具第一步map 展开运算符求最大年龄people.map(p p.age)Array.prototype.map遍历输入数组把每个{ name, age }对象投影为纯数字age得到一个新的年龄数组例如[40]或[30, 25]或[25, 30, 30]。Math.max(...people.map(p p.age))Math.max接收的是若干个数值参数而非数组因此这里借助**展开运算符spread syntax**把年龄数组展开成多个实参。Math.max(...[30, 25])等价于Math.max(30, 25)。这一步得到全局最大年龄maxAge。一个需要留意的点是当输入数组很大时展开运算符会一次性把所有参数压入调用栈可能触发Maximum call stack size exceeded。对本题的典型测试数据规模而言完全安全但如果要处理超大数组可以用Math.max(...arr)的替代写法如循环或reduce来规避。第二步filter按最大年龄筛选people.filter(p p.age maxAge)Array.prototype.filter保留所有age严格等于maxAge的对象。关键特性filter天然保持原数组顺序因此平局者的输出顺序与输入顺序完全一致——这正是题目对平局场景的要求。第三步map提取姓名.map(p p.name)对筛选结果再做一次map把{ name, age }对象投影为纯字符串姓名最终得到string[]类型的返回结果。组合验证以最后一个 hint 为例输入包含 8 个对象年龄最大值为 50对应 George、Holly、Zach 三人且他们在输入中依次出现输出[George, Holly, Zach]与输入顺序完全一致assert.deepEqual校验通过。全部测试用例逐条分析原文档--hints--区块给出了 4 组测试断言全部使用assert.deepEqual进行深比较比较数组内容而非引用。逐条分析如下输入说明期望输出[{ name: Brenda, age: 40 }]单元素唯一人选[Brenda][{ name: Alice, age: 30 }, { name: Bob, age: 25 }]无平局最大年龄唯一[Alice][{ name: Allison, age: 25 }, { name: Bill, age: 30 }, { name: Carol, age: 30 }]有平局需返回全部且保序[Bill, Carol]8 人混合年龄数组George 50、Holly 50、Zach 50三人平局分散在输入各处[George, Holly, Zach]从这组用例可以总结出必须同时满足的约束返回值是数组即使只有一人平局者全部返回一个都不能漏顺序保持输入次序与年龄大小无关与年龄无关的其他属性不参与比较name只是输出字段。其中第 4 个用例特别具有迷惑性输入中 George、Shirley、Beth、Holly 等人的年龄参差不齐只有同时正确完成求最大与过滤两步才能稳定通过全部断言。多种实现思路对比官方解法利用高阶函数非常简洁但面试与编码实践中常见的替代方案同样值得掌握方案一单次遍历 pushfunction getOldest(people) { let maxAge -Infinity; const names []; for (const p of people) { if (p.age maxAge) { maxAge p.age; names.length 0; names.push(p.name); } else if (p.age maxAge) { names.push(p.name); } } return names; }只遍历一次且天然保持顺序遇到更大的年龄时清空已有结果遇到并列时追加。时间复杂度 O(n)且不依赖展开运算符。方案二reduce求最大值const maxAge people.reduce((m, p) Math.max(m, p.age), -Infinity);用reduce显式迭代取代Math.max(...arr)适合超大数组场景避免展开运算符的栈溢出隐患。方案三先排序再取头部不推荐function getOldest(people) { const sorted [...people].sort((a, b) b.age - a.age); const maxAge sorted[0].age; return sorted.filter(p p.age maxAge).map(p p.name); }虽然也能通过测试但注意必须使用[...people]浅拷贝避免原地排序污染输入且排序是 O(n log n)比线性扫描更慢更重要的是排序会打乱平局者的原始顺序必须再借助filter从原数组中提取才能保证顺序正确——这反而绕了远路。官方解法用filter直接基于原数组过滤一步到位。边界情况与注意事项空数组Math.max(...[])返回-Infinity此时filter结果为空返回[]。若要求对空输入报错或返回null需要额外判断本题测试未涉及。年龄字段缺失p.age为undefined时Math.max结果变为NaN比较恒为false返回[]。真实项目中应先用Number.isFinite之类的守卫校验数据。年龄为负数或字符串数字50这类字符串与数字比较时会发生隐式类型转换可能带来非预期行为本题测试数据均为合法数字但编码时值得警惕。assert.deepEqual的严格性返回[Brenda]而非Brenda、[Brenda]而非[brenda]任何类型或大小写偏差都会导致断言失败。这正是--hints--区块中assert.deepEqual深比较的意义所在。挑战文件的仓库结构本题对应的源文件位于 curriculum/challenges/english/blocks/daily-coding-challenges-javascript/69e2383af7832c8032603b90.md采用 freeCodeCamp 挑战的标准 Markdown 结构frontmatter声明id69e2383af7832c8032603b90、titleChallenge 274: Oldest Person、challengeType: 28每日编程挑战类型与dashedNamechallenge-274其中id同时出现在 板块结构配置 的challengeOrder数组中用于课程构建系统按序组装板块# --description--面向学习者的题目文本# --hints--自动化测试断言assert.deepEqual由课程测试运行器执行# --seed--预置的函数骨架function getOlded(people) { return people; }学习者在此补全逻辑# --solutions--官方参考实现供学习者对照与维护者审阅。仓库中相邻题目如 Challenge 272: Transposed Matrix、Challenge 273: ISBN-13 Validator采用完全相同的文件结构与测试机制说明这是该板块统一的题目规范。此外每日编程挑战的题目数据在前端侧还有 daily-coding-challenge-validator.ts 使用 Joi 对挑战的tests与challengeFiles结构做运行期校验确保从数据库取出的题目数据符合测试运行器预期。总结Oldest Person 是一道典型的对象数组极值 保序过滤题。官方解法用两行代码展示了map投影、展开运算符传参、filter条件筛选且保持顺序与链式调用的组合威力而遍历、reduce等替代方案则在性能和可读性之间提供了不同取舍。掌握这道题的思路后你可以举一反三地解决同板块中 Challenge 46 2nd Largest、Challenge 220 Largest Number 等一系列极值类问题也能理解 freeCodeCamp 如何通过--hints--断言把需求描述转化为可验证的自动化测试。【免费下载链接】freeCodeCampfreeCodeCamp.orgs open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考