遍历对象数组筛选miles属性值,代码返回空数组问题排查
问题:筛选符合条件的航班城市却返回空数组
我需要从航班对象数组中筛选出符合以下条件的城市:
- 航班出发地与用户的出发地一致
- 目的地的
miles值小于等于用户的miles值 - 将符合条件的
city属性存入数组返回
但当前代码返回空数组,以下是我的代码、预期结果和实际结果:
let flights = [{origin: 'AEP', destinations:[{city: 'PARIS', miles: 500}, {city: 'BOLZANO', miles: 200}, {city: 'DUBAI', miles: 400}]}, {origin: 'MXP', destinations: [{city: 'SAINT-TROPEZ', miles: 30}]},{origin: 'AEP', destinations: [{city: 'LISBON', miles: 30}, {city: 'MADRID', miles: 700}, {city: 'NICE', miles: 200}]}] let user = { name: 'Elena', miles: 450, origin: 'AEP' }
我的函数代码:
function closureTrip(flights){ let list = []; let array = []; return function(user) { for (let i = 0; i < flights.length; i++) { if (flights[i].origin === user.origin) { list.push(flights[i].destinations); for (let j = 0; j < list.length; j++){ if(list[j].miles <= user.miles){ array.push(list[j].city); } return array } } } } }
- 预期结果:
closureTrip(flights)(user) => [ 'BOLZANO', 'DUBAI', 'LISBON', 'NICE' ] - 实际结果:
closureTrip(flights)(user) => []
问题原因
- 数组嵌套处理错误:
flights[i].destinations本身是数组,你用list.push(flights[i].destinations)会把整个数组作为元素存入list,导致list[j]是数组而非单个目的地对象,自然没有miles和city属性。 - 过早返回结果:内层循环第一次迭代后就直接
return array,不仅没完成所有遍历,而且第一次循环时list[j]是数组,条件不满足,所以返回空数组。 - 变量作用域污染:
list和array定义在外部函数,多次调用返回的函数时会保留之前的结果,导致数据混乱。
修正后的代码
基础循环版本
function closureTrip(flights){ return function(user) { const result = []; // 遍历所有航班 for (const flight of flights) { // 匹配出发地 if (flight.origin === user.origin) { // 遍历当前航班的所有目的地 for (const dest of flight.destinations) { // 筛选里程符合条件的城市 if (dest.miles <= user.miles) { result.push(dest.city); } } } } return result; } }
数组方法简洁版本
function closureTrip(flights){ return function(user) { return flights // 筛选出发地匹配的航班 .filter(flight => flight.origin === user.origin) // 提取所有目的地数组并合并为一维数组 .flatMap(flight => flight.destinations) // 筛选里程符合条件的目的地 .filter(dest => dest.miles <= user.miles) // 提取城市名称 .map(dest => dest.city); } }
调用closureTrip(flights)(user)会返回预期的[ 'BOLZANO', 'DUBAI', 'LISBON', 'NICE' ]。
内容的提问来源于stack exchange,提问作者Andres Hernandez
相关产品推荐
相关产品推荐

