如何在JavaScript中按指定键过滤数组中的对象?
嘿,这个需求在JavaScript里用Array.filter()就能轻松搞定,我结合你给出的事件数组,拆解几种常见的过滤场景,你可以按需选用:
1. 基础场景:按单个键的固定值匹配
如果只是想筛选某个键等于特定值的对象,直接在filter的回调里做相等判断就行。比如要找出所有eventType为craft的事件:
const events = [ { "startDay": "05-06", "endDay": "05-06", "startTime": "xxxx", "eventType": "craft" }, { "startDay": "05-05", "endDay": "05-06", "startTime": "1400", "eventType": "art" }, { "startDay": "05-08","endDay": "05-08", "startTime": "1100", "eventType": "music" }, { "startDay": "05-08","endDay": "05-08", "startTime": "1400", "eventType": "fishing" }, { "startDay": "05-07","endDay": "05-08", "startTime": "1400", "eventType": "football" } ]; // 筛选eventType为craft的事件 const craftEvents = events.filter(event => event.eventType === "craft"); console.log(craftEvents); // 输出:[{ "startDay": "05-06", "endDay": "05-06", "startTime": "xxxx", "eventType": "craft" }]
2. 组合场景:按多个键的条件匹配
要是需要同时满足多个键的条件,比如筛选5月8日当天完成(startDay和endDay都是05-08)的事件,就用逻辑运算符把条件组合起来:
// 筛选5月8日当天的事件 const may8SameDayEvents = events.filter(event => event.startDay === "05-08" && event.endDay === "05-08" ); console.log(may8SameDayEvents); // 输出:包含music和fishing的两个对象
3. 复杂场景:处理跨范围的键值匹配
像你数组里的football事件是跨05-07到05-08的,如果要筛选所有覆盖5月8日的事件(不管是当天还是跨天到当天),得先把日期转成可比较的格式,再做范围判断:
// 辅助函数:把MM-DD格式的日期转成数字(比如05-08转成508),方便比较 const dateToNumber = dateStr => parseInt(dateStr.replace("-", "")); // 筛选所有覆盖05-08的事件 const coversMay8Events = events.filter(event => { const startDateNum = dateToNumber(event.startDay); const endDateNum = dateToNumber(event.endDay); const targetDateNum = dateToNumber("05-08"); // 只要开始日期≤目标日期,且结束日期≥目标日期,就说明覆盖了目标日期 return startDateNum <= targetDateNum && endDateNum >= targetDateNum; }); console.log(coversMay8Events); // 输出:包含music、fishing、football的三个对象
4. 通用场景:动态指定键和过滤条件
如果想写一个复用性强的函数,支持动态传入要过滤的键和判断逻辑,可以这样封装:
function filterByKey(events, targetKey, conditionFn) { return events.filter(event => conditionFn(event[targetKey])); } // 用法示例1:筛选startTime为1400的事件 const startTime1400Events = filterByKey(events, "startTime", val => val === "1400"); // 用法示例2:筛选startDay晚于05-06的事件 const afterMay6Events = filterByKey(events, "startDay", val => dateToNumber(val) > 506);
内容的提问来源于stack exchange,提问作者user21
相关产品推荐
相关产品推荐

