chichi
chichi

Reputation: 3292

Flutter: how to return the value by using other value inside the List<Map>

I have a List<Map<String, String>> like below

[
   { 'name': 'John', 'id': 'aa' },
   { 'name': 'Jane', 'id': 'bb' },
   { 'name': 'Lisa', 'id': 'cc' },
]

And, the ID list **List** as ['bb', 'aa']. By using the ID list, I want to return a new list ['Jane', 'John'] as **List _selectedList**.

I have tried to do it with the .**indexWhere**, however, I am stuck on the List where it has more than one value.

How can I return the List only with the name-value when there is more than one value to look for?

Upvotes: 0

Views: 679

Answers (2)

Afridi Kayal
Afridi Kayal

Reputation: 2285

Use a set to filter out the IDs efficiently.

var ids = ["aa", "cc"];
var idSet = Set<String>.from(ids);

var json = [
    { 'name': 'John', 'id': 'aa' },
    { 'name': 'Jane', 'id': 'bb' },
    { 'name': 'Lisa', 'id': 'cc' },
];

var _selectedList = json.where((data) => idSet.contains(data["id"]))
                        .map((data) => data["name"]).toList();

print(_selectedList);

Here, .where filters out the data where the ID matches one in the input list "IDs". Sets make the process efficient. Then, the resultant objects are passed to .map where the "name" field is extracted. Finally, the whole thing is converted into a list thus returning the list of names.

Output of the above code:

[John, Lisa]

Upvotes: 1

void main() {
  var a = [
   { 'name': 'John', 'id': 'aa' },
   { 'name': 'Jane', 'id': 'bb' },
   { 'name': 'Lisa', 'id': 'cc' },
  ];
  var b = ['bb', 'aa'];
  
  var c = a.where((m) => b.contains(m['id'])).map((m) => m['name']);
  
  print(c);
}

Result

(John, Jane)

Upvotes: 2

Related Questions