如何通过Dart中的值获取Map键?

时间:2018-08-28 07:23:00

标签: dictionary dart key

在Dart语言中,如何通过值获取MAP键?

我有一个类似的地图;

<div>
    <b-list-group">
        @foreach($projects as $project)
        <b-list-group-item>{{ $project->title }}</b-list-group-item>
        @endforeach
    </b-list-group>
</div>

我需要使用值来获取密钥。我该怎么办?

7 个答案:

答案 0 :(得分:14)

var usdKey = curr.keys.firstWhere(
    (k) => curr[k] == 'USD', orElse: () => null);

答案 1 :(得分:3)

如果要对同一数据多次执行此操作,则应创建一个反向映射,以便可以执行简单的键查找,而不是重复进行线性搜索。这是反转地图的示例(可能有更简单的方法):

main() {
  var orig = {"01": "USD", "17": "GBP", "33": "EUR"};
  var reversed = Map.fromEntries(orig.entries.map((e) => MapEntry(e.value, e.key)));
  for (var kv in reversed.entries) {
    print(kv);
  }
}

编辑:是的,反转地图可以简单地是:

var reversed = orig.map((k, v) => MapEntry(v, k));

这顶帽子给乔·康威带来了麻烦。谢谢。

答案 2 :(得分:1)

您可以执行以下操作:

var mapper = { 
              '01' : 'USD',
               '17' : 'GBP'     } 

for(var val in mapper.keys){

  switch(mapper[val]){

        case 'USD' : {
                             print('key for ${mapper[val]} is : ' '${val}');  
            }

          break;

        case 'GBP' : {
                             print('key for ${mapper[val]} is : ' '${val}');   
               } 

        }
          }

答案 3 :(得分:1)

还有另一种方法(类似于GünterZöchbauer的答案):

void main() {

  Map currencies = {
     "01": "USD",
     "17": "GBP",
     "33": "EUR"
  };

  MapEntry entry = currencies.entries.firstWhere((element) => element.value=='GBP', orElse: () => null);

  if(entry != null){
    print('key = ${entry.key}');
    print('value = ${entry.value}');
  }

}

在此代码中,您将获得MapEntry,其中包含键和值,而仅包含单独变量中的键。在某些代码中可能很有用。

答案 4 :(得分:1)

如果仍然需要解决方案,我写了一个simple library,以深入Map内的值(在嵌套地图内搜索)。用法很简单,因为deepSearchByValue()是扩展方法,因此您所需要做的就是导入我的库并在地图上调用该方法:

import 'package:deep_collection/deep_collection.dart';


void main() {
  print({
    "01": "USD",
    "17": "GBP",
    "33": "EUR",
  }.deepSearchByValue((value) => value == 'USD'));
}

答案 5 :(得分:1)

以 Randal Schwartz 的回答为基础:

Map<T, R> invertMap<T, R>(Map<R, T> toInvert) =>
  Map.fromEntries(toInvert.entries.map((e) => MapEntry(e.value, e.key)));

答案 6 :(得分:0)

Map map = {1: 'one', 2: 'two', 3: 'three'};

var key = map.keys.firstWhere((k) => map[k] == 'two', orElse: () => null);
print(key);