在Dart或Flutter中,Maps和List是预定义的数据结构类型,用于存储集合。
地图包含元素的键和值对 列表包含元素的集合。
从Map到List或List到Map的自动转换是不可能的。
我们必须手动从Map转换到List,反之亦然。
有多种方法可以从Map转换到List。
例如,让我们创建一个雇员类
class Employee {
final int id;
final String name;
final int salary;
final DateTime joinDate;
Employee(this.id, this.name, this.salary, this.joinDate);
@override
String toString() {
return '{id: ${id}, name: ${name}}';
}
Map toJson() =>
{"id": id, "name": name, "salary": salary, "doj": joinDate.toString()};
}
让我们创建Map ,并向其添加一些数据。
import 'dart:convert';
class Employee {
final int id;
final String name;
final int salary;
final DateTime joinDate;
Employee(this.id, this.name, this.salary, this.joinDate);
@override
String toString() {
return '{id: ${id}, name: ${name}}';
}
Map toJson() =>
{"id": id, "name": name, "salary": salary, "doj": joinDate.toString()};
}
void main() {
final e1 =
Employee(11, 'Erwin', 9000, DateTime.parse("2020-06-21 00:00:00.000"));
final e2 =
Employee(21, 'Andrew', 70000, DateTime.parse("2021-07-23 00:00:00.000"));
final e3 =
Employee(4, 'Mark', 8000, DateTime.parse("2017-08-24 00:00:00.000"));
final e4 =
Employee(12, 'Otroc', 5000, DateTime.parse("2022-12-05 00:00:00.000"));
final Map employees = {
e1.id: e1,
e2.id: e2,
e3.id: e3,
e4.id: e4
};
print(employees);
}
输出:
{11: {id: 11, name: Erwin}, 21: {id: 21, name: Andrew}, 4: {id: 4, name: Mark}, 12: {id: 12, name: Otroc}}
接下来,看看我们如何将Map转换为键和值的List。
如何在Flutter和dart中将对象的Map转换为List?
地图包含键和值对,所以我们可以将键和值转换成一个列表。
将Map的值转换为对象的列表的例子
Map.values属性返回Iterable 类,使用toList() 雇员地图包含雇员类型的值,因此它返回List 类型,将其转换为列表。
var listValues = employees.values.toList();
print(listValues);
print(listValues.runtimeType);
[{id: 11, name: Erwin}, {id: 21, name: Andrew}, {id: 4, name: Mark}, {id: 12, name: Otroc}]
JSArray
将键的地图转换为元素的列表的例子
Map.values属性返回Iterable 类,使用toList() 将其转换为List,Employees map包含int 类型的键,因此它返回int 类型。
var listKeys = employees.keys.toList();
print(listKeys);
print(listKeys.runtimeType);
[11, 21, 4, 12]
JSArray
如何在Flutter和dart中把对象的列表转换为Map?
我们有多种方法可以从Map转换为List。
第一种方法,Map.fromIterable() 方法迭代并从一个列表中创建一个键和值。
var result = Map.fromIterable(employees,
key: (element) => element.id, value: (element) => element);
print(
result); //{11: {id: 11, name: Erwin}, 21: {id: 21, name: Andrew}, 4: {id: 4, name: Mark}, 12: {id: 12, name: Otroc}}
print(result.runtimeType); // JsLinkedHashMap
它返回Map ,由于类型安全问题,不推荐使用。
第二种方式,使用集合为
var result1 = {for (var value in employees) value.id: value};
print(
result1); //{11: {id: 11, name: Erwin}, 21: {id: 21, name: Andrew}, 4: {id: 4, name: Mark}, 12: {id: 12, name: Otroc}}
print(result1.runtimeType); //JsLinkedHashMap
它返回精确的类型Map ,这是推荐的方法。
下面是一个完整的示例代码
import 'dart:convert';
class Employee {
final int id;
final String name;
final int salary;
final DateTime joinDate;
Employee(this.id, this.name, this.salary, this.joinDate);
@override
String toString() {
return '{id: ${id}, name: ${name}}';
}
Map toJson() =>
{"id": id, "name": name, "salary": salary, "doj": joinDate.toString()};
}
void main() {
final e1 =
Employee(11, 'Erwin', 9000, DateTime.parse("2020-06-21 00:00:00.000"));
final e2 =
Employee(21, 'Andrew', 70000, DateTime.parse("2021-07-23 00:00:00.000"));
final e3 =
Employee(4, 'Mark', 8000, DateTime.parse("2017-08-24 00:00:00.000"));
final e4 =
Employee(12, 'Otroc', 5000, DateTime.parse("2022-12-05 00:00:00.000"));
List employees = [e1, e2, e3, e4];
print(employees); //
var result = Map.fromIterable(employees,
key: (element) => element.id, value: (element) => element);
print(
result); //{11: {id: 11, name: Erwin}, 21: {id: 21, name: Andrew}, 4: {id: 4, name: Mark}, 12: {id: 12, name: Otroc}}
print(result.runtimeType); // JsLinkedHashMap
var result1 = {for (var value in employees) value.id: value};
print(
result1); //{11: {id: 11, name: Erwin}, 21: {id: 21, name: Andrew}, 4: {id: 4, name: Mark}, 12: {id: 12, name: Otroc}}
print(result1.runtimeType); //JsLinkedHashMap
}
总结
综上所述,通过实例展示了将List转换为Map和将Map转换为List的多种方法。