flutter - 数组索引index
来源:blog.csdn.net 更新时间:2023-05-25 21:55
问题
在Dart中,对于数组的操作,比如List.map不能很方便地访问列表的索引 Index。
比如,对于一个List,要获取它的的index索引,很难做到。
List myList = ['a', 'b', 'c'];
myList.map( (val, index) {
// 错误,map方法没有index参数!
// 如何获取index?
})
解决方案
遍历列表时,有几种访问索引的方法。
- 方法一. 将List转换为Map
将List转换为Map,然后映射包含键/值对的条目。映射中的每个键都是原始列表的索引。
var m = myList.asMap().entries.map((entry) {
int idx = entry.key;
String val = entry.value;
return {idx, val};
});
- 方法二. 使用 包 collection中的扩展方法(推介)
将转换List为Map,然后映射包含键/值对的条目。映射中的每个键都是原始列表的索引。
import 'package:collection/collection.dart';
void main() {
final data = ['apple', 'orange', 'mango'];
final withIndices = data.mapIndexed((index, element) => "$index - $element");
}
- 方法三. 生成固定范围列表
如果要遍历许多具有固定长度的列表,则一次生成一个列表可能会更有效。例如,借助函数 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));
}
上一篇:传递参数的单例模式 下一篇:flutter如何让输入框软键盘自动上移