问题
在Dart中,对于数组的操作,比如List.map不能很方便地访问列表的索引 Index。
比如,对于一个List,要获取它的的index索引,很难做到。
List myList
= ['a', 'b', 'c'];
myList
.map( (val
, 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
);
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
);
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
));
}