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

search in maps dart2 , same as list.indexOf?

我使用此示例在地图中进行搜索但不起作用:|:

  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 is not a function

请帮助我在 map 对象中 search 简单方法与 indexOf.

相同

我找到了答案:

 print(xmenObj.values.toList().indexOf('4xmen')); // 2

或者这个:

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

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

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

entries getter 是在Dart 2中引入的,如果你没有那个,那么使用 map.values.toList().indexOf(value) 来获取迭代位置,然后 map.keys.elementAt(thatIndex)得到对应的key。

如果你真的只想要数字索引,那么你可以跳过最后一步。 它不是非常有效(您分配一个新列表并复制所有值)。另一种方法是:

int indexOfValue<V>(Map<Object, V> map, V value) {
  int i = 0;
  for (var mapValue in map.values) {
    if (mapValue == value) return i;
    i++;
  }
  return -1;
}

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

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