Używam tej próbki do wyszukiwania w mapie, ale nie działa: |:

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

Ale mam błąd TypeError: xmenObj.indexOf$1 is not a function na ostatniej linii kodu.

Pomóż mi do wyszukiwania w map obiekt prosty taki sam jak indexOf.

0
A1Gard 4 czerwiec 2018, 03:46

3 odpowiedzi

Najlepsza odpowiedź

Znalazłem odpowiedź:

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

Albo to:

  var ind = xmenObj.values.toList().indexOf('4xmen') ;
  print(xmenObj.keys.toList()[ind]); // fifth
0
A1Gard 4 czerwiec 2018, 21:18

Mapy nie są indeksowalne za pomocą liczb całkowitych, więc nie ma pracy odpowiadającej indexOf. Jeśli widzisz listę jako specjalistyczne mapy, w których klucze są zawsze kolejnymi liczbami całkowitymi, odpowiednia operacja powinna znaleźć klucz dla danej wartości. Mapy nie są w tym celu, więc iteracji przez wszystkie klucze i wartości są jedynym sposobem na ten wynik. Zrobiłbym to jako:

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 entries jest wprowadzany w DART 2. Jeśli nie masz tego, a następnie za pomocą pozycji map.values.toList().indexOf(value), aby uzyskać pozycję iteracji, a następnie map.keys.elementAt(thatIndex), aby uzyskać odpowiedni klawisz.

Jeśli naprawdę chcesz tylko wskaźnik numeryczny, możesz pominąć ten ostatni krok. To nie jest niezwykle wydajne (przydzielasz nową listę i skopiuj wszystkie wartości). Innym podejściem jest:

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
lrn 4 czerwiec 2018, 07:59

Możesz wyszukiwać za pomocą .where(...), jeśli chcesz znaleźć wszystko pasujące lub firstWhere Jeśli zakładasz, że może być tylko jeden lub tylko chcesz

var found = xmenObj.keys.firstWhere(
    (k) => xmenObj[k] == '4xmen', orElse: () => null);
print(xmenObj[found]);
0
Günter Zöchbauer 5 czerwiec 2018, 02:52