74 votes

Comment obtenir les clés d'une carte par les valeurs en Dart ?

En langage Dart, comment obtenir les clés MAP par les valeurs ?

J'ai une carte comme ;

{
  "01": "USD",
  "17": "GBP",
  "33": "EUR"
}

Et j'ai besoin d'utiliser des valeurs pour obtenir des clés. Comment dois-je faire ?

133voto

Günter Zöchbauer Points 21340
var usdKey = curr.keys.firstWhere(
    (k) => curr[k] == 'USD', orElse: () => null);

26voto

Randal Schwartz Points 9756

Si vous devez effectuer cette opération plus de quelques fois sur les mêmes données, vous devriez créer une carte inverse afin de pouvoir effectuer une simple recherche de clé au lieu de recherches linéaires répétées. Voici un exemple d'inversion d'une carte (il existe peut-être des moyens plus simples de le faire) :

main() {
  var orig = {"01": "USD", "17": "GBP", "33": "EUR"};
  var reversed = Map.fromEntries(orig.entries.map((e) => MapEntry(e.value, e.key)));
  for (var kv in reversed.entries) {
    print(kv);
  }
}

Edit : oui, inverser une carte peut simplement être :

var reversed = orig.map((k, v) => MapEntry(v, k));

Coup de chapeau à Joe Conway sur gitter. Merci.

9voto

Makdir Points 95

Il existe une autre méthode (similaire à la réponse de Günter Zöchbauer) :

void main() {

  Map currencies = {
     "01": "USD",
     "17": "GBP",
     "33": "EUR"
  };

  MapEntry entry = currencies.entries.firstWhere((element) => element.value=='GBP', orElse: () => null);

  if(entry != null){
    print('key = ${entry.key}');
    print('value = ${entry.value}');
  }

}

Dans ce code, vous obtenez MapEntry, qui contient la clé et la valeur, au lieu de seulement la clé dans une variable séparée. Cela peut être utile dans certains codes.

3voto

Owczar Points 1299

Si quelqu'un a encore besoin d'une solution, j'ai écrit une bibliothèque simple pour effectuer une recherche profonde (recherche à l'intérieur de cartes imbriquées) ou une recherche par valeur à l'intérieur d'une carte. Map . L'utilisation est simple, car deepSearchByValue() est une méthode d'extension, il vous suffit donc d'importer ma bibliothèque et d'appeler la méthode sur votre carte :

import 'package:deep_collection/deep_collection.dart';

void main() {
  print({
    "01": "USD",
    "17": "GBP",
    "33": "EUR",
  }.deepSearchByValue((value) => value == 'USD'));
}

2voto

Puneet Nagar Points 19

Vous pouvez procéder comme suit :

var mapper = { 
              '01' : 'USD',
               '17' : 'GBP'     } 

for(var val in mapper.keys){

  switch(mapper[val]){

        case 'USD' : {
                             print('key for ${mapper[val]} is : ' '${val}');  
            }

          break;

        case 'GBP' : {
                             print('key for ${mapper[val]} is : ' '${val}');   
               } 

        }
          }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X