Перечислять или отображать в списке с индексом и значением в дартс
В дротике есть какой-то эквивалент общего:
enumerate(List) -> Iterator((index, value) => f)
or
List.enumerate() -> Iterator((index, value) => f)
or
List.map() -> Iterator((index, value) => f)
Кажется, это самый простой способ, но все же странно, что эта функциональность не существует.
Iterable<int>.generate(list.length).forEach( (index) => {
newList.add(list[index], index)
});
Edit:
Благодаря @hemanth-raj я смог найти решение, которое искал.
Я положу это здесь для тех, кому нужно сделать что-то подобное.
List<Widget> _buildWidgets(List<Object> list) {
return list
.asMap()
.map((index, value) =>
MapEntry(index, _buildWidget(index, value)))
.values
.toList();
}
В качестве альтернативы вы можете создать функцию синхронного генератора, которая будет возвращать итерируемый
Iterable<MapEntry<int, T>> enumerate<T>(Iterable<T> items) sync* {
int index = 0;
for (T item in items) {
yield MapEntry(index, item);
index = index + 1;
}
}
//and use it like this.
var list = enumerate([0,1,3]).map((entry) => Text("index: ${entry.key}, value: ${entry.value}"));
Ответы
Ответ 1
Существует метод asMap
который преобразует список в карту, где ключи - это индекс, а значения - это элемент в индексе. Пожалуйста, посмотрите на документы здесь.
Пример:
List _sample = ['a','b','c'];
_sample.asMap().forEach((index, value) => f);
Надеюсь это поможет!
Ответ 2
Пакет Lukas Renggli more включает в себя множество полезных инструментов, включая "indexed", который делает именно то, что вы хотите. Из документов:
indexed(['a', 'b'], offset: 1)
.map((each) => '${each.index}: ${each.value}')
.join(', ');
(Вы можете игнорировать аргумент смещения, если у вас нет фона Smalltalk :-).
Ответ 3
Опираясь на ответ @Hemanth Raj.
Чтобы преобразовать его обратно, вы можете сделать
List<String> _sample = ['a', 'b', 'c'];
_sample.asMap().values.toList();
//returns ['a', 'b', 'c'];
Или, если вам нужен индекс для функции отображения, вы можете сделать это:
_sample
.asMap()
.map((index, str) => MapEntry(index, str + index.toString()))
.values
.toList();
// returns ['a0', 'b1', 'c2']
Ответ 4
Нет встроенной функции для получения индекса итерации.
Если вам, как и мне, вам не нравится идея построить Map
(структуру данных) только для простого индекса, то вам, вероятно, понадобится map
(функция), которая дает вам индекс. Пусть call это mapIndexed
(как в Kotlin):
children: mapIndexed(
list,
(index, item) => Text("event_$index")
).toList();
Реализация mapIndexed
проста:
Iterable<E> mapIndexed<E, T>(
Iterable<T> items, E Function(int index, T item) f) sync* {
var index = 0;
for (final item in items) {
yield f(index, item);
index = index + 1;
}
}