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));
}