如何在不影响原列表的情况下从Dart列表中移除字段
问题原因
你当前代码里的datacopy = [...data]是浅拷贝——只复制了列表本身,但列表里的每个Map对象还是和原data列表里的Map共用同一个引用。所以你修改datacopy里的Map时,原data里的Map也会跟着变。另外你的removeItem函数里,map返回的新列表没有赋值回datacopy,等于白操作了。
解决方法
要实现只修改datacopy,需要给每个Map也创建独立的副本,再移除id字段,有两种简单方式:
方式1:生成新列表时直接排除id字段
直接通过map遍历原列表,对每个元素生成不含id的新Map:
void main() { List<Map<String, dynamic>> data = [ { 'id': '1', 'domain': '00extreme.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 00 ] [ extreme ]' }, { 'id': '2', 'domain': '00hrs.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 00 ] [ hrs ]' }, { 'id': '3', 'domain': '00k3.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 00 ] [ k ] [ 3 ]' }, { 'id': '4', 'domain': '00I.net', 'TDL': 'net', 'status': 'parked', 'adult': 'No', 'keywords': '[ 00I.net ]' }, { 'id': '5', 'domain': '02text.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 02 ] [ text ]' }, { 'id': '6', 'domain': '0zzy.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 0 ] [ zz ] [ y ]' }, { 'id': '7', 'domain': '100facial.com', 'TDL': 'com', 'status': 'parked', 'adult': 'Yes', 'keywords': '[ 100 ] [ facial ]' }, { 'id': '8', 'domain': '1000fotosgratis.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 1000 ] [ fotos ] [ gratis ]' }, { 'id': '9', 'domain': '1000petstores.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 1000 ] [ pet ] [ stores ]' }, { 'id': '10', 'domain': '1000toys.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 100 ] [ toys ]' }, ]; // 生成不含id的datacopy List<Map<String, dynamic>> datacopy = data.map((item) { return Map.fromEntries(item.entries.where((entry) => entry.key != 'id')); }).toList(); print(data); // 原data仍保留id字段 print(datacopy); // datacopy已移除id字段 }
方式2:先复制每个Map再移除id
先对每个Map做浅拷贝(因为你的Map值都是字符串,浅拷贝足够),再移除id:
void main() { List<Map<String, dynamic>> data = [ // 原数据保持不变 { 'id': '1', 'domain': '00extreme.com', 'TDL': 'com', 'status': 'parked', 'adult': 'No', 'keywords': '[ 00 ] [ extreme ]' }, // ...其他元素 ]; List<Map<String, dynamic>> datacopy = data.map((item) { // 复制原Map的所有键值对到新Map var newMap = Map<String, dynamic>.from(item); newMap.remove('id'); return newMap; }).toList(); print(data); print(datacopy); }
额外说明
如果你的Map里还有嵌套的复杂对象(比如其他Map或List),那需要做深拷贝,但当前场景下所有值都是字符串,浅拷贝就足够解决问题。
内容的提问来源于stack exchange,提问作者sachintha
相关产品推荐
相关产品推荐

