在地图dart2中搜索,与list.indexOf相同?

在地图dart2中搜索,与list.indexOf相同?,dart,dart-2,Dart,Dart 2,我使用此示例在地图中搜索,但不工作:|: var xmenList = ['4','xmen','4xmen','test']; var xmenObj = { 'first': '4', 'second': 'xmen', 'fifth': '4xmen', 'author': 'test' }; print(xmenList.indexOf('4xmen')); // 2 print(xmenObj.indexOf('4xmen')); // ? 但

我使用此示例在地图中搜索,但不工作:|:

  var xmenList = ['4','xmen','4xmen','test'];
  var xmenObj = {
  'first': '4',
  'second': 'xmen',
  'fifth': '4xmen',
   'author': 'test'
  };

  print(xmenList.indexOf('4xmen')); // 2
  print(xmenObj.indexOf('4xmen')); // ?
但是我有错误
TypeError:xmenObj.indexOf$1不是最后一行代码中的函数

请帮助我在地图搜索对象,方法与
indexOf
相同我找到了答案:

 print(xmenObj.values.toList().indexOf('4xmen')); // 2
或者这个:

  var ind = xmenObj.values.toList().indexOf('4xmen') ;
  print(xmenObj.keys.toList()[ind]); // fifth

映射不能用整数进行索引,因此没有与
indexOf
对应的操作。如果将列表视为专用映射,其中键始终是连续整数,则相应的操作应找到给定值的键。 映射不是为此而构建的,因此遍历所有键和值是获得该结果的唯一方法。 我会这样做:

K keyForValue<K, V>(Map<K, V> map, V value) {
  for (var entry in map.entries) {
    if (entry.value == value) return key;
  }
  return null;
}

如果要查找所有匹配项,可以使用
.where(…)
进行搜索;如果假设只有一个匹配项或只需要第一个匹配项,则可以使用
firstWhere
进行搜索

var found = xmenObj.keys.firstWhere(
    (k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);

这太复杂了,我需要一个简单的方法,我发现了这个。你不能假设键和值的顺序是相同的。在第二个示例中,如果
xmenObj.keys.toList()[ind]
返回了正确的密钥,那么这只是运气使然。@GünterZöchbauer luck?你在开玩笑吧?但这个答案正好适合我的工作:)是的,纯粹是运气。您的解决方案建立在一个不保证为真的假设之上。实际上,Dart
HashMap
LinkedHashMap
确实承诺迭代值等同于迭代键并查找相应的值。只要映射在迭代之间不改变,我们也保证迭代顺序是稳定的。显然,这是平台库地图唯一可以保证的东西,但一般来说是推荐的。谢谢,它对我很有效。你错了,它不简单:|,我只是说需要简单的方式而不是复杂的方式。
var found = xmenObj.keys.firstWhere(
    (k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);