0

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

  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

4

3 回答 3

1

我找到了答案:

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

或这个:

  var ind = xmenObj.values.toList().indexOf('4xmen') ;
  print(xmenObj.keys.toList()[ind]); // fifth
于 2018-06-04T00:51:35.090 回答
0

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

var found = xmenObj.keys.firstWhere(
    (k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);
于 2018-06-05T02:46:45.913 回答
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;
}

getter 是在 Dart 2 中引入的entries。如果你没有那个,那么使用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;
}
于 2018-06-04T07:59:30.017 回答