flutter - 数组索引Index问题

    技术2022-07-11  97

    问题

    在Dart中,对于数组的操作,比如List.map不能很方便地访问列表的索引 Index。

    比如,对于一个List,要获取它的的index索引,很难做到。

    List myList = ['a', 'b', 'c']; myList.map( (val, index) { // 错误,map方法没有index参数! // 如何获取index? })

    解决方案

    遍历列表时,有几种访问索引的方法。

    方法一. 使用地图条目 将转换List为Map,然后映射包含键/值对的条目。映射中的每个键都是原始列表的索引。 var m = myList.asMap().entries.map((entry) { int idx = entry.key; String val = entry.value; return {idx, val}; }); 方法二. 生成固定范围列表 (常用) 如果要遍历许多具有固定长度的列表,则一次生成一个列表可能会更有效。例如,借助函数 generate 我们创建一个与原始列表长度相同的范围列表,即[0, 1, 2, …, n] final List fixedList = Iterable<int>.generate(myList.length).toList(); print(fixedList); // [0,1,2] var m = fixedList.map((idx) { String val = myList[idx]; return val; }); 方法三. 获取指定value的key值 您可以使用 List.indexOf 搜索特定值的索引,该索引将返回第一个匹配项的索引。 当所有值都是唯一的时,这种方法是最可预测的。一组可以确保唯一性在整个列表。 final List uniqueList = Set.from(myList).toList(); uniqueList.map((val) { String idx = uniqueList.indexOf(val); return idx; });

    方法二UI示例

    @override Widget build(BuildContext context) { List dataList =[ {"name":"颖儿", "age": 18,}, {"name":"大飞", "age": 22,}, {"name":"老王", "age": 35,}, ]; final List fixedList = Iterable<int>.generate(dataList.length).toList(); print(fixedList); // [0,1,2] return Row( children: fixedList.map((idx) { var item = dataList[idx]; return Row( children: <Widget>[ Text(item["name"]), Text("---"), Text(item["age"].toString()), ], ); }, ).toList(), ), }

    从列表的Object属性中取最大值

    List<Map<String, dynamic>> users = [ {"id": 123, "name": "Bob", "age": 25}, {"id": 345, "name": "Joe", "age": 44}, {"id": 35, "name": "Joxe", "age": 40}, ]; /// 方法一 if (users != null && users.isNotEmpty) { users.sort((a, b) => a['age'].compareTo(b['age'])); print(users.last['age']); } /// 方法二 if (users != null && users.isNotEmpty) { dynamic max = users.first; users.forEach((e) { if (e['age'] > max['age']) max = e; }); print(max['age']); } /// 其他方法 if (users != null && users.isNotEmpty) { print(users.fold<int>(0, (max, e) => e['age'] > max ? e['age'] : max)); } /// 其他方法 if (users != null && users.isNotEmpty) { print(users.map<int>((e) => e['age']).reduce(max)); }
    Processed: 0.011, SQL: 9