Карты не индексируются целыми числами, поэтому нет операции, соответствующей 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
. Если у вас его нет, используйте 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;
}