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

时间:2018-06-04 00:46:56

标签: 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')); // ?

但我在最后一个代码行上有错误TypeError: xmenObj.indexOf$1 is not a function

请帮助我搜索 地图对象与indexOf相同的简单方法。

3 个答案:

答案 0 :(得分:0)

我找到了答案:

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

或者这个:

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

答案 1 :(得分:0)

地图不能按整数编制索引,因此没有与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;
}

Dart 2中引入了entries getter。如果你没有,那么使用map.values.toList().indexOf(value)获取迭代位置,然后使用map.keys.elementAt(thatIndex)获取相应的密钥。

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

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;
}

答案 2 :(得分:0)

如果您想查找所有匹配项,可以使用.where(...)进行搜索;如果您认为只有一个匹配项,则可以使用firstWhere进行搜索

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