如何根据嵌套的day_id值过滤包含Hours数组的对象?
问题分析与解决
原始数据结构
"times": [{ "id" : "id", "name" : "place", "location" : "place", "hours" : [ {"day": "Sunday", "day_id": 0, "tags": "" }, {"day": "Monday", "day_id": 1, "tags": "" }, {"day": "Tuesday", "day_id": 2, "tags": "" }, {"day": "Wednesday", "day_id": 3, "tags": "" }, {"day": "Thursday", "day_id": 4, "tags": "" }, {"day": "Friday", "day_id": 5, "tags": "" }, {"day": "Saturday", "day_id": 6, "tags": "" } ] }]
你的错误代码
let f1 = times.filter((item: { id: string; hours: { day_id : number;};}) => item.hours.day_id == 0 );
问题所在
- 类型定义错误:你把
hours定义成了单个对象类型,但实际上它是一个对象数组,类型应该写成数组形式。 - 逻辑错误:直接访问
item.hours.day_id无效——数组本身没有day_id属性,你需要遍历数组元素,判断是否存在符合条件的项。
修正后的代码
方式一:先定义清晰类型(更易维护)
// 定义子项类型 interface Hour { day: string; day_id: number; tags: string; } // 定义父项类型 interface TimeItem { id: string; name: string; location: string; hours: Hour[]; } // 过滤逻辑:保留hours数组中包含day_id=0的项 let f1 = (times as TimeItem[]).filter(item => item.hours.some(hour => hour.day_id === 0) );
方式二:直接修正类型与逻辑(快速实现)
let f1 = times.filter((item: { id: string; hours: Array<{ day_id: number }>;}) => item.hours.some(hour => hour.day_id === 0) );
核心是用Array.some()方法判断hours数组中是否存在符合条件的元素——只要有一个元素满足day_id === 0,对应的父项就会被保留在过滤结果里。
内容的提问来源于stack exchange,提问作者almostasnecessary
相关产品推荐
相关产品推荐

