2013-03-14 27 views
14

Làm cách nào để tôi có thể dễ dàng làm phẳng mảng/danh sách trong Dart?Làm thế nào để san bằng một mảng?

Ví dụ:

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

Làm thế nào để tắt chức năng này "a" một danh sách duy nhất chứa tất cả những giá trị đó?

Trả lời

22

Cách dễ nhất tôi biết là sử dụng Iterable.expand() với chức năng nhận dạng. expand() mất mỗi phần tử của một Iterable, thực hiện một hàm trên nó trả về một phần có thể lặp lại (phần "mở rộng"), và sau đó ghép nối các kết quả. Trong các ngôn ngữ khác, nó có thể được gọi là flatMap.

Vì vậy, bằng cách sử dụng chức năng nhận dạng, mở rộng sẽ chỉ nối các mục. Nếu bạn thực sự muốn có một Danh sách, hãy sử dụng toList().

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

Nice! Tôi nghĩ ai đó nên tạo danh sách các thủ thuật phổ biến trong Dart. –

+2

Công thức tuyệt vời cho @shailentuli để thêm. –

+0

Để xử lý nhiều cấp độ lồng nhau hơn, tôi làm điều này: Làm phẳng có thể lặp lại (Iterable iterable) => iterable.expand ((e) => e là Danh sách? Flatten (e): [e]); –

4

Tôi không nghĩ rằng có một phương pháp tích hợp cho điều đó, nhưng bạn luôn có thể làm giảm nó đến một giá trị duy nhất:

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

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

print(flatten); 

Tôi muốn addAll() sẽ quay trở lại danh sách ban đầu. Hiện tại nó không trả về gì cả. Nếu điều đó là đúng, bạn có thể viết một lớp lót đơn: a.reduce([], (p, e) => p.addAll(e)).

Ngoài ra, bạn có thể chỉ cần lặp qua danh sách và thêm:

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

Bạn có thể viết lót đơn sử dụng thác: a.reduce ([], (p, e) => p..addAll (e)) –

0

giải pháp với mở rộng phương pháp phù hợp tốt để đáp ứng trường hợp này:

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

Nhưng không cho luận án những

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

Để đáp ứng trường hợp thử nghiệm đề tài, bạn cần một cái gì đó đệ quy giống như chức năng sau:

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

Trân trọng,

Sébastien

Các vấn đề liên quan