Dart/Flutter:如何将map转换为list/将list转换为map

3,015 阅读3分钟

在Dart或Flutter中,Maps和List是预定义的数据结构类型,用于存储集合。

地图包含元素的键和值对 列表包含元素的集合。

从Map到List或List到Map的自动转换是不可能的。

我们必须手动从Map转换到List,反之亦然。How to Convert list and Map of objects key and values Dart and Flutter

有多种方法可以从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的多种方法。