prepareRidesData函数触发TypeError,请求问题排查与修复
问题分析与解决
错误原因定位
- 核心触发点:调用
prepareRidesData时未传入第二个必填参数parks,导致函数内parks变量为undefined,调用undefined.forEach()直接抛出TypeError。 - 附带问题:原函数存在副作用(直接修改传入的
rides数组元素),且未处理parks为空、park_name匹配失败等边界场景。
修复后的完整实现
优化后的prepareRidesData函数
function prepareRidesData(rides, parks = []) { // 校验输入合法性 if (!Array.isArray(rides) || rides.length === 0) return []; if (!Array.isArray(parks)) return [...rides].map(ride => { delete ride.park_name; return ride; }); // 构建公园名称到ID的映射表(过滤无效数据) const parksLookup = parks.reduce((map, { park_id, park_name }) => { if (park_name && park_id !== undefined) { map[park_name] = park_id; } return map; }, {}); // 返回新数组,不修改原输入(避免副作用) return rides.map(ride => { const newRide = { ...ride }; // 仅在匹配到有效park_id时添加字段 if (newRide.park_name && parksLookup[newRide.park_name]) { newRide.park_id = parksLookup[newRide.park_name]; } delete newRide.park_name; return newRide; }); }
修正后的测试代码
test("替换park_name为对应park_id", () => { // 补充缺失的公园映射数据 const parks = [ { park_name: "Thorpe Park", park_id: 1 }, { park_name: "Alton Towers", park_id: 5 } ]; const input = [ { ride_name: "Tidal Wave", year_opened: 2000, park_name: "Thorpe Park", votes: 1, }, { ride_name: "Nemesis", year_opened: 1994, park_name: "Alton Towers", votes: 5, // 修正原测试中错误的votes值 } ]; const actual = prepareRidesData(input, parks); const expected = [ { ride_name: "Tidal Wave", year_opened: 2000, park_id: 1, votes: 1, }, { ride_name: "Nemesis", year_opened: 1994, park_id: 5, votes: 5, } ]; expect(actual).toEqual(expected); });
关键优化说明
- 参数容错:给
parks设置默认空数组,同时校验输入是否为数组,避免非数组输入导致的崩溃。 - 无副作用设计:通过对象展开
{...ride}创建新对象,不修改原输入数组的元素,防止污染外部数据。 - 边界处理:过滤无名称或ID的无效公园数据,匹配失败时不会添加无效的
park_id字段。 - 测试修正:补充了缺失的公园测试数据,修正了原测试中第二个条目错误的
votes值。
内容的提问来源于stack exchange,提问作者user11130151
相关产品推荐
相关产品推荐

