多级地图或飞镖中的地图列表?

时间:2020-01-16 11:20:47

标签: flutter dart

我有一个这样的位置数据地图:

{
  'country': 'Japan',
  'city': 'Tokyo',
  'Latitude': 35.6762,
  'Longitude': 139.6503,
  'utcOffset': 9
}

女巫是存储此数据的正确解决方案,为什么?

1)地图列表:

List<Map<String, dynamic>> locations = [
 {
      'country': 'Japan',
      'city': 'Tokyo',
      'Latitude': 35.6762,
      'Longitude': 139.6503,
      'utcOffset': 9
    }
];

或多级数据对象

var locations = {
{
      'country': 'Egypt',
      'city': 'Cairo',
      'Latitude': 30.033333,
      'Longitude': 31.233334,
      'utcOffset': 2
    },
    {
      'country': 'Thailand',
      'city': 'Bangkok',
      'Latitude': 13.7563,
      'Longitude': 100.5018,
      'utcOffset': 7
    },
};

在两种情况下如何访问数据?

3 个答案:

答案 0 :(得分:2)

当我想拥有键值对时,我通常使用Map,因为我可以直接通过键获取值。例如,如果您有Map名员工,并且将员工ID保留为密钥,则可以轻松访问它。特别适合搜索或下拉菜单。

在大多数情况下,如果我可以避免使用Map,而我会使用List,因为对我来说,处理大量数据非常容易(在Flutter中,我可以轻松地将列表扔到ListView上) )。

但是根据情况的不同,两者都有自己的优势。请注意,Map不能有重复的密钥,而List不能具有这样的限制(例如:Map可以用来避免重复)。

  var locations = {
    {
      'country': 'Egypt',
      'city': 'Cairo',
      'Latitude': 30.033333,
      'Longitude': 31.233334,
      'utcOffset': 2
    },
    {
      'country': 'Thailand',
      'city': 'Bangkok',
      'Latitude': 13.7563,
      'Longitude': 100.5018,
      'utcOffset': 7
    },
  };

  for (var element in locations) {
    print(element["country"]);
  }

  // or

  locations.forEach((element) => print(element["country"]));

以下是有关此文档的内容:

Map<K, V> class

键/值对的集合,您可以使用来从中检索值 其关联的密钥。

地图中键的数量有限,每个键都具有 一个与之相关的值。

可以迭代映射及其键和值。的顺序 迭代由地图的个别类型定义。

List<E> class

具有长度的对象的可索引集合。

此类的子类实现不同类型的列表。最多 常见的列表类型是:

Fixed-length list. An error occurs when attempting to use operations that can change the length of the list.

Growable list. Full implementation of the API defined in this class.

新的List()[]返回的默认可增长列表会保留一个 内部缓冲区,并在必要时增加该缓冲区。这保证了 一系列的添加操作将分别摊销 恒定的时间。直接设置长度可能需要一定的时间 到新的长度,并且可能会更改内部容量,以便 以下添加操作将需要立即增加缓冲区 容量。其他列表实现可能具有不同的性能 行为。

答案 1 :(得分:1)

您可以同时使用这两种方法,但是首选第一种方法,因为它更容易遍历所有项目并获取数据。 不是说您不能遍历第二个数据集,而是要遍历数组更加繁琐。

鉴于您的对象数组如下所示:

List<Map<String, dynamic>> locations = [
 {
      'country': 'Japan',
      'city': 'Tokyo',
      'Latitude': 35.6762,
      'Longitude': 139.6503,
      'utcOffset': 9
    }
];

假设您要取出所有国家/地区名称并将它们存储在单独的数组中,这真的很容易,并且代码应如下所示:

List<String> countryNames = [];
locations.forEach((location) => countryNames.add(location['country]));

答案 2 :(得分:0)

您可以从创建此函数的 Map 动态获取数据 getData

  dynamic getData(Map data, List<String> way) {
    dynamic dataTemp = data;
    if (way.length > 0) {
      for (int x=0; x < way.length; x++) {
        dataTemp = dataTemp[way[x]];
      }
    }
    return dataTemp;
  }

    List<Map<String, dynamic>> locations = [
 {
      'country': 'Japan',
      'city': 'Tokyo',
      'Latitude': 35.6762,
      'Longitude': 139.6503,
      'utcOffset': 9,
      'example' : {
        'data'   : "text",
        'number' : 20,
        'boolean': false
       }
    }
];


 getData(locations[0],["example","number"]);

输出:20