如何从对象数组中提取时间范围KEYS?代码修改求助
提取时间范围键的代码修复
需求与问题
需要从对象数组tempRemovedTimeRanges中提取所有时间范围的KEYS(而非时间戳值),现有代码输出空数组,请求修改。
数据结构说明
tempRemovedTimeRanges是包含日期对象的数组,每个日期对象(如Wednesdays)对应一个包含时间范围对象的数组- 时间范围对象的键格式为
T_xx:xx_Start或T_xx:xx_End
现有代码
console.log(tempRemovedTimeRanges); const removedKeys = tempRemovedTimeRanges .flatMap(obj => Object.values(obj)) .filter(dayArray => dayArray.some(dayObj => Object.keys(dayObj)[0] === elementToInsert)) .flatMap(dayArray => dayArray .filter(dayObj => Object.keys(dayObj)[0] === elementToInsert) .flatMap(dayObj => dayObj[elementToInsert].flatMap(range => Object.keys(range))) ); console.log(removedKeys);
当前问题
代码输出空数组[],期望输出为所有时间范围KEYS组成的数组,例如['T_04:00_Start', 'T_08:00_End', ...]
修复方案
方案1:提取所有时间范围KEYS
如果需求是提取所有时间范围的键,直接去掉不必要的过滤逻辑,简化层级处理:
console.log(tempRemovedTimeRanges); const removedKeys = tempRemovedTimeRanges .flatMap(obj => Object.values(obj)) // 展开每个日期对象对应的时间范围数组 .flatMap(dayArray => dayArray) // 展开数组中的每个时间范围对象 .flatMap(dayObj => Object.keys(dayObj)); // 提取每个对象的所有键 console.log(removedKeys);
方案2:提取特定elementToInsert关联的KEYS
如果你的需求是只提取与elementToInsert相关的时间范围键,修复原代码中的判断逻辑和层级错误:
console.log(tempRemovedTimeRanges); const removedKeys = tempRemovedTimeRanges .flatMap(obj => Object.values(obj)) .flatMap(dayArray => // 过滤出包含elementToInsert键的对象 dayArray.filter(dayObj => Object.keys(dayObj).includes(elementToInsert)) // 提取该键对应值的所有时间范围键 .flatMap(dayObj => Object.keys(dayObj[elementToInsert])) ); console.log(removedKeys);
原代码错误分析
- 不必要的过滤逻辑:原代码强行筛选
Object.keys(dayObj)[0] === elementToInsert的对象,若elementToInsert不是对象的第一个键,或你需要提取所有键,这会导致数据被错误过滤。 - 层级处理错误:原代码中
dayObj[elementToInsert].flatMap(...)假设dayObj[elementToInsert]是数组,但如果它本身就是时间范围对象,flatMap会报错或返回空值。
内容的提问来源于stack exchange,提问作者SirBT
相关产品推荐
相关产品推荐

