如何访问嵌套列表中的Map值并筛选符合条件的元素、移除空项
问题原因
你手里的data是嵌套列表结构,外层列表的每一项本身都是只存了单个Map的子列表。你直接对外层列表做where操作时,拿到的参数e是子列表,不是子列表里的Map对象,自然无法读取e['page']属性;你后面写的循环写法是对每个子列表单独做筛选,不符合条件的子列表会返回空的可迭代对象,所以结果里会出现大量空项。
最优解决方案
用expand方法先把嵌套列表拍平成一维的Map序列,再做筛选即可,代码如下:
List data = [[{"number": 1, "page": 1, "Text": "a"}],[{"number": 2, "page": 2, "Text": "b"}],[{"number": 3, "page": 3, "Text": "c"}],[{"number": 4, "page": 4, "Text": "d"}], [{"number": 5, "page": 5, "Text": "e"}],[{"number": 6, "page": 6, "Text": "f"}],[{"number": 7, "page": 7, "Text": "g"}]]; // 先拍平嵌套列表,再筛选符合条件的元素 var filteredResult = data.expand((subList) => subList).where((item) => item['page'] == 1).toList();
expand方法会迭代外层列表的每一个子列表,把子列表里的所有元素展开成一个平铺的序列,拍完平后你拿到的就是每个独立的Map对象,再做where筛选就能正常判断属性,最终得到的结果就是所有符合条件的Map组成的列表,不会有空项。
基于你原有写法的调整方案
如果你不想改动原有循环的逻辑,也可以在生成列表后加一步过滤空项+展开的操作:
var filteredResult = [for(int i = 0;i < data.length; i++) data[i].where((e) => e['page'] == 1)] .where((subResult) => subResult.isNotEmpty) // 先过滤掉空的筛选结果 .expand((subResult) => subResult) // 把嵌套的结果展开成一维列表 .toList();
内容的提问来源于stack exchange,提问作者Zimor。
相关产品推荐
相关产品推荐

