You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选出foodSelectedKey值与foodFilter数组匹配的foodLog对象条目

问题原因

filter是数组专属原型方法,你当前state.foodLog被初始化为对象类型{},调用该方法自然会报错。同时原代码还存在两处逻辑问题:一是错误直接访问foodLog.foodsSelectedKey而非遍历到的单条条目的对应字段,二是用map返回布尔数组不符合filter要求的单个布尔值判断规则。


解决方案

场景1:foodLog本身设计为存储所有录入条目的数组(最常见场景)

如果你本来就是要把多条用户录入的条目存在foodLog中,先调整state初始值为数组类型:

state = {
    // 调整为数组类型存储多条录入条目
    foodLog: [],
    // 用于过滤条目的关键词数组
    foodFilter: [],
};

之后修正过滤逻辑即可,按需选择匹配规则:

findMatches = () => {
    const { foodLog, foodFilter } = this.state;
    // 匹配规则1:条目的foodSelectedKey只要有一个值在过滤器中就算命中,用some
    const matched = foodLog.filter(item => {
        return item.foodSelectedKey.some(food => foodFilter.includes(food));
    });
    // 匹配规则2:条目的foodSelectedKey所有值都在过滤器中才算命中,替换为every即可
    // const matched = foodLog.filter(item => {
    //     return item.foodSelectedKey.every(food => foodFilter.includes(food));
    // });
    return matched;
};

场景2:foodLog确实设计为对象结构

如果你的foodLog设计为键是条目唯一标识、值是单条录入对象的结构(比如{ 'entry1': { foodSelectedKey: ['苹果'] }, 'entry2': { foodSelectedKey: ['香蕉'] } }),先把对象的值转为数组再过滤即可:

findMatches = () => {
    const { foodLog, foodFilter } = this.state;
    // 取出对象所有值转为数组
    const foodLogList = Object.values(foodLog);
    const matched = foodLogList.filter(item => {
        return item.foodSelectedKey.some(food => foodFilter.includes(food));
    });
    return matched;
};

注意:你代码中写的foodsSelectedKey比你描述的键名多了一个s,请根据实际业务的字段名调整代码中的对应字段。

内容的提问来源于stack exchange,提问作者Candace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:48:01