toKeysMap<K, V> method
Converts this Iterable<Iterable<T
>> (a list of values) to a List<Map
<K
, V
>>.
keys
the keys of the values, in the same order.useHeaderLine
uses the first line as header, for thekeys
of the values.keepKeys
an options list of keys to keep (will remove keys not present atkeepKeys
).filter
a filter each resultingMap
entry. Should returntrue
for valid entries.
Implementation
List<Map<K, V>> toKeysMap<K, V>({
List<K>? keys,
bool useHeaderLine = false,
Iterable<K>? keepKeys,
bool Function(Map<K, V> map)? filter,
}) {
var lines = this;
if (keys == null && useHeaderLine) {
var header = first;
keys = header.cast<K>().toList();
lines = skip(1);
}
if (keys == null) {
throw ArgumentError("Can't determine keys!");
}
var keysResolved = keys;
if (keepKeys != null && keepKeys.isNotEmpty) {
var keepKeysResolved = keepKeys.length > 10 && keepKeys is! Set
? keepKeys.toSet()
: keepKeys;
return lines
.map((cols) {
var m = <K, V>{};
for (var i = 0; i < cols.length; ++i) {
var v = cols.elementAt(i);
var k = keysResolved[i];
if (keepKeysResolved.contains(k)) {
m[k] = v as V;
}
}
return filter == null || filter(m) ? m : null;
})
.whereType<Map<K, V>>()
.toList();
} else {
return lines
.map((cols) {
var m = <K, V>{};
for (var i = 0; i < cols.length; ++i) {
var v = cols.elementAt(i);
var k = keysResolved[i];
m[k] = v as V;
}
return filter == null || filter(m) ? m : null;
})
.whereType<Map<K, V>>()
.toList();
}
}