Как я могу легко сгладить List
в дартс?
Например:
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = [1, 2, 3, 'a', 'b', 'c', true, false, true];
Как мне превратить a
в b
, то есть в один List
содержащий все эти значения?
Как я могу легко сгладить List
в дартс?
Например:
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var b = [1, 2, 3, 'a', 'b', 'c', true, false, true];
Как мне превратить a
в b
, то есть в один List
содержащий все эти значения?
Самый простой способ, которым я знаю, - использовать Iterable.expand()
с функцией идентификации. expand()
принимает каждый элемент Iterable, выполняет на нем функцию, которая возвращает итерируемую (часть "expand" ), а затем объединяет результаты. На других языках он может быть известен как flatMap.
Таким образом, используя функцию идентификации, expand просто конкатенирует элементы. Если вам действительно нужен Список, используйте toList()
.
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var flat = a.expand((i) => i).toList();
Я не думаю, что для этого есть встроенный метод, но вы всегда можете уменьшить его до одного значения:
var a = [[1, 2, 3], ['a', 'b', 'c'], [true, false, true]];
var flatten = a.reduce([], (p, e) {
p.addAll(e);
return p;
});
print(flatten);
Желаю, чтобы addAll()
вернул исходный список. В настоящее время он ничего не возвращает. Если это так, вы можете написать один вкладыш: a.reduce([], (p, e) => p.addAll(e))
.
Кроме того, вы можете просто просмотреть список и добавить:
var flatten = [];
a.forEach((e) => flatten.addAll(e));
решение с методом расширения подходит для удовлетворения этого случая:
expect(ListTools.getFlatList([[1],["hello",2],["test"]]),orderedEquals([1,"hello",2,"test"]));
Но не для тезисов
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"]));
Чтобы удовлетворить тезисы тестов, вам нужно что-то более рекурсивное, например, следующая функция:
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;
}
С уважением,
Себастьен