vasos tutorial traduccion google español container dart

tutorial - dart vs javascript



¿Cómo aplanar una lista? (3)

¿Cómo puedo fácilmente aplanar una List en Dart?

Por ejemplo:

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

¿Cómo convierto a en b , es decir, en una List única que contiene todos esos valores?


La forma más fácil que conozco es usar Iterable.expand() con una función de identidad. expand() toma cada elemento de un Iterable, realiza una función en él que devuelve una iterable (la parte "expandir"), y luego concatena los resultados. En otros idiomas puede ser conocido como flatMap.

Entonces, al usar una función de identidad, expandir solo concatenará los elementos. Si realmente desea una lista, use toList() .

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


La solución con método expand se ajusta bien para satisfacer este caso:

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

Pero no para estos

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"]));

Para satisfacer estos casos de prueba, necesita algo más recursivo como la siguiente función:

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; }

Atentamente,

Sébastien


No creo que haya un método incorporado para eso, pero siempre puedes reducirlo a un solo valor:

var a = [[1, 2, 3], [''a'', ''b'', ''c''], [true, false, true]]; var flatten = a.reduce([], (p, e) { p.addAll(e); return p; }); print(flatten);

Deseo que addAll() devuelva la lista original. Actualmente no devuelve nada. Si eso fuera cierto, podría escribir un solo liner: a.reduce([], (p, e) => p.addAll(e)) .

Alternativamente, puedes recorrer la lista y agregar:

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