2013-03-14 5 views
14

Comment est-ce que je peux facilement aplatir un tableau/une liste dans Dart?Comment aplatir un tableau?

Par exemple:

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]] 

Comment activer ce « un » à une liste unique contenant toutes ces valeurs?

Répondre

22

La façon la plus simple que je connaisse est d'utiliser Iterable.expand() avec une fonction d'identité. expand() prend chaque élément d'un Iterable, exécute une fonction sur lui qui renvoie une itérable (la partie "expand"), puis concatène les résultats. Dans d'autres langues, il peut être appelé flatMap.

Ainsi, en utilisant une fonction d'identité, développez sera juste concaténer les articles. Si vous voulez vraiment une liste, utilisez toList().

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]]; 
var flat = a.expand((i) => i).toList(); 
+1

de Nice! Je pense que quelqu'un devrait faire une liste des grands trucs communs dans Dart. –

+2

Recette géniale pour @shailentuli à ajouter. –

+0

Pour gérer plus niveaux d'imbrication, je fais ceci: Iterable aplatissent (Iterable itérables) => iterable.expand ((e) => e est la liste aplatir (e): [e]); –

4

Je ne pense pas qu'il y ait une méthode intégrée pour cela, mais vous pouvez toujours réduire à une seule valeur:

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]]; 

var flatten = a.reduce([], (p, e) { 
    p.addAll(e); 
    return p; 
}); 

print(flatten); 

Je souhaite addAll() retourneraient la liste initiale. Actuellement, il ne retourne rien. Si cela était vrai, vous pourriez écrire un seul paquebot: a.reduce([], (p, e) => p.addAll(e)).

Alternativement, vous pouvez simplement boucle à travers la liste et d'ajouter:

var flatten = []; 
a.forEach((e) => flatten.addAll(e)); 
+4

Vous pouvez écrire la doublure simple en utilisant des cascades: a.reduce ([], (p, e) => p..addAll (e)) –

0

la solution avec méthode d'expansion correspond bien pour satisfaire ce cas:

expect(ListTools.getFlatList([[1],["hello",2],["test"]]),orderedEquals([1,"hello",2,"test"])); 

Mais pas pour les thèses

expect(ListTools.getFlatList([[1],["hello",2,["foo",5]],["test"]]),orderedEquals([1,"hello",2,"foo",5,"test"])); 
expect(ListTools.getFlatList([1,["hello",2],"test"]),orderedEquals([1,"hello",2,"test"])); 

Pour satisfaire les cas de test des thèses, vous avez besoin comme quelque chose de plus récursive la fonction suivante:

List getFlatList(List list) { 
    List internalList = new List(); 
    list.forEach((e) { 
    if (e is List) { 
     internalList.addAll(getFlatList(e)); 
    } else { 
     internalList.add(e); 
    } 
    }); 
    return internalList; 
} 

Meilleures salutations,

Sébastien