如何将Sqlite rawQuery返回的查询结果映射为指定格式的Map<String, List>
问题原因
你的原有写法每次遍历都会直接为对应key赋值新列表,会直接覆盖该key之前已有的数据,因此同个key的内容不会合并,只会保留最后一次赋值的结果。
实现代码
基础循环写法(可读性最高)
Map<String, List> _map = {}; for (var item in result) { // 取出作为key的placeCol字段值 String key = item['placeCol'] as String; // 取出需要存入列表的字段值,如需存多个字段可改为 [item['NameCol'], item['SubDataCol']] var targetValue = item['NameCol']; if (_map.containsKey(key)) { // key已存在,直接往已有列表追加值 _map[key]!.add(targetValue); } else { // key不存在,初始化新列表 _map[key] = [targetValue]; } }
简洁写法(基于Dart内置方法)
使用putIfAbsent方法可以简化判断逻辑:
Map<String, List> _map = {}; for (var item in result) { String key = item['placeCol'] as String; // key不存在时自动创建空列表,直接向列表追加元素 _map.putIfAbsent(key, () => []).add(item['NameCol']); }
函数式写法
用fold方法可以快速完成转换:
final _map = result.fold<Map<String, List>>({}, (acc, item) { final key = item['placeCol'] as String; acc[key] = (acc[key] ?? [])..add(item['NameCol']); return acc; });
内容的提问来源于stack exchange,提问作者Alex Apps
相关产品推荐
相关产品推荐

