Flutter:如何检查嵌套模型列表中是否包含指定值
Flutter嵌套模型列表中检查目标值的实现方式
在Flutter开发场景下,需要检查Data、Group、Weapon三层嵌套模型列表中是否存在指定的武器名称,同时希望了解是否有比普通For Loop更高效的实现方式。
定义的模型类
class Data { List<Group>? data; Data({this.data}); } class Group { int? id; List<Weapon>? weaponItems; String? groupName; Group({ this.id, this.weaponItems, this.groupName, }); } class Weapon { int? id; String? name; Weapon({this.id, this.name}); }
测试实例与目标值
final Data mainData = Data( data: [ Group( id: 1, groupName: 'Assault Riffle', weaponItems: [ Weapon(id: 1, name: 'Ak47'), Weapon(id: 2, name: 'M4'), ], ), Group( id: 2, groupName: 'SMG', weaponItems: [ Weapon(id: 3, name: 'MP5'), Weapon(id: 4, name: 'Dual UZI'), ], ), ], ); String myWeapon = 'Dual Uzi';
实现方案
1. 普通For Loop实现
逐层遍历并处理可能为空的列表,找到匹配项后立即返回:
bool containsWeapon() { if (mainData.data == null) return false; for (var group in mainData.data!) { if (group.weaponItems == null) continue; for (var weapon in group.weaponItems!) { // 忽略大小写匹配,可根据需求调整规则 if (weapon.name?.toLowerCase() == myWeapon.toLowerCase()) { return true; } } } return false; }
2. 更简洁高效的Iterable方法实现
利用Dart集合的any()方法,该方法支持短路遍历(找到匹配项后立即终止遍历),性能与普通循环相当,但代码更简洁:
bool containsWeapon() { return mainData.data?.any((group) => group.weaponItems?.any((weapon) => weapon.name?.toLowerCase() == myWeapon.toLowerCase() ) ?? false ) ?? false; }
效率说明
两种方式的核心逻辑一致,在找到目标值时都会立即停止遍历,性能差异可忽略。但any()方法的代码更简洁,可读性更强,更符合Dart的编程风格。
内容的提问来源于stack exchange,提问作者Septian Dika
相关产品推荐
相关产品推荐

