toKeysMap<K, V> method

List<Map<K, V>> toKeysMap<K, V>({
  1. List<K>? keys,
  2. bool useHeaderLine = false,
  3. Iterable<K>? keepKeys,
  4. bool filter(
    1. Map<K, V> map
    )?,
})

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 the keys of the values.
  • keepKeys an options list of keys to keep (will remove keys not present at keepKeys).
  • filter a filter each resulting Map entry. Should return true 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();
  }
}