You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:15:48