如何根据状态数组过滤包含全部指定true键的事件对象?
解决方案
核心需求:根据用户选择的年龄分组数组(如['youth', 'college']),筛选出**所有数组元素对应的ageDivisions键值均为true**的事件对象。
简化过滤逻辑
不需要把ageDivisions转成二维数组,直接用数组的every()方法就能高效完成校验:
- 遍历过滤数组中的每个键
- 确保事件的
ageDivisions中该键存在且值为true
修改后的完整代码
if (filterParamaters.ageDivisions && filterParamaters.ageDivisions.length > 0) { let parsedEvents = events.data.map(({ attributes: event }) => { return { ...event, ...event.attributes, ageDivisions: JSON.parse(event.ageDivisions), eventStyles: JSON.parse(event.eventStyles), }; }); filteredEventss = parsedEvents.filter((event) => { // 先确保event.ageDivisions是有效对象,避免报错 if (!event.ageDivisions || typeof event.ageDivisions !== 'object') { return false; } // 核心校验:过滤数组的所有键在事件中都必须为true return filterParamaters.ageDivisions.every(division => { return event.ageDivisions[division] === true; }); }); console.log({ filteredEventss }); }
代码说明
- 边界处理:先判断过滤参数是否有效,同时校验事件的
ageDivisions是否为合法对象,避免运行时报错。 - 核心校验逻辑:
every()方法会逐一检查过滤数组中的每个元素,只有当所有元素对应的ageDivisions值都是true时,该事件才会被保留。 - 效率优化:直接访问对象属性的方式比转二维数组更高效,代码也更简洁易读。
举个例子:针对你给出的示例事件对象,若过滤数组是['youth', 'college'],该事件会被保留;若过滤数组是['youth', 'open'],则会被排除(因为open对应的值是false)。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

