如何压扁列表?

Ahm*_*med 29 dart

如何List在Dart中轻松展平?

例如:

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = [1, 2, 3, 'a', 'b', 'c', true, false, true];
Run Code Online (Sandbox Code Playgroud)

如何打开ab,即变成一个List包含所有这些值?

Jus*_*ani 49

我所知道的最简单的方法是使用Iterable.expand()身份功能.expand()获取Iterable的每个元素,对其执行返回可迭代("扩展"部分)的函数,然后连接结果.在其他语言中,它可以被称为flatMap.

因此,通过使用标识函数,展开将只连接项目.如果你真的想要一个List,那就用吧toList().

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

  • 为了处理更多级别的嵌套,我这样做: Iterable flatten(Iterable iterable) => iterable.expand((e) => e is List ? flatten(e) : [e]); (4认同)
  • 好的!我认为应该有人列出 Dart 中常见的伟大技巧。 (3认同)
  • 添加@shailentuli令人敬畏的食谱. (2认同)

Kai*_*ren 6

我不认为有一个内置的方法,但你总是可以将它减少到一个值:

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

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

print(flatten);
Run Code Online (Sandbox Code Playgroud)

我希望addAll()将返回原始列表.目前它什么都不返回.如果这是真的,你可以写一个单一的班轮:a.reduce([], (p, e) => p.addAll(e)).

或者,您可以循环遍历列表并添加:

var flatten = [];
a.forEach((e) => flatten.addAll(e));
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用级联编写单个衬管:a.reduce([],(p,e)=> p..addAll(e)) (5认同)

use*_*956 5

您可以使用生成器有效地执行此操作:

Iterable<T> flatten<T>(Iterable<Iterable<T>> items) sync* {
  for (var i in items) {
    yield* i;
  }
}

Iterable<X> flatMap<T,X>(Iterable<Iterable<T>> items, X Function(T) f) =>
  flatten(items).map(f);

Run Code Online (Sandbox Code Playgroud)


jam*_*lin 5

在 Dart 2.3 或更高版本中,您可以改为使用 collection-for和 spread 运算符来轻松展平列表。我个人认为它比使用更具可读性Iterable.expand

List<T> flatten<T>(Iterable<Iterable<T>> list) =>
    [for (var sublist in list) ...sublist];

var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = flatten(a);
print(b); // Prints: [1, 2, 3, a, b, c, true, false, true] 
Run Code Online (Sandbox Code Playgroud)

如果有需要递归展平的嵌套列表,您可以使用:

List<T> flattenDeep<T>(Iterable<dynamic> list) => [
      for (var element in list)
        if (element is! Iterable) element else ...flattenDeep(element),
    ];

var a = [[1, [[2], 3]], [[['a']], 'b', 'c'], [true, false, [true]]];
var b = flattenDeep(a);
print(b) // Prints: [1, 2, 3, a, b, c, true, false, true] 
Run Code Online (Sandbox Code Playgroud)