поиск по картам dart2, такой же как list.indexOf? - PullRequest
0 голосов
/ 04 июня 2018

Я использую этот пример для поиска в Карте, но не работаю: |:

  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 голосов
/ 04 июня 2018

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

Вы можете искать, используя .where(...), если хотите найти все, что соответствует, или firstWhere, если вы предполагаете, что может быть только один, или вы хотите только первое

var found = xmenObj.keys.firstWhere(
    (k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);
0 голосов
/ 04 июня 2018

Я нашел ответ:

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

или это:

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