Flutter中如何多条件过滤JSON数据?实现产品名+机构UID双条件筛选
解决方案
你的现有代码存在语法错误(toList()后多余的标点),且判断机构UID匹配的方式效率偏低(where会遍历所有机构再转列表,不如直接判断是否存在匹配项更高效)。以下是完善后的代码,兼顾产品名称与机构UID的筛选需求,同时处理了空值安全与多场景适配:
List<mmamodel> results = []; // 标记是否需要应用对应筛选条件 bool needProductFilter = productName.isNotEmpty; bool needAgencyFilter = Uid.isNotEmpty; if (!needProductFilter && !needAgencyFilter) { // 无任何筛选条件,返回全部数据 results = mmaData; } else { results = mmaData.where((element) { // 产品名称匹配逻辑(无筛选时直接为true) bool matchesProduct = !needProductFilter || element.product.toString().toLowerCase().contains(productName.toLowerCase()); // 机构UID匹配逻辑:处理agencies为空的情况,无筛选时直接为true bool matchesAgency = !needAgencyFilter || (element.agencies?.any((agency) => agency.agencyUid.toString().toLowerCase() == Uid.toLowerCase()) ?? false); // 同时满足两个筛选条件(若均有设置) return matchesProduct && matchesAgency; }).toList(); } foundProduct.value = results;
关键优化点:
- 空值安全:用
element.agencies?.any(...) ?? false处理agencies为null的情况,避免空指针异常 - 效率提升:使用
any()方法判断机构UID,找到第一个匹配项就停止遍历,比where().toList()更高效 - 场景覆盖:支持仅筛选产品、仅筛选机构、同时筛选两者、无筛选四种场景
- 匹配灵活:代码中用
==做UID精确匹配,若需要模糊匹配可替换回contains
内容的提问来源于stack exchange,提问作者Raghava Reddy
相关产品推荐
相关产品推荐

