My intention is to format the name key in an existing Map value.
Supposed the current key value is in UpperCase but I wanted to make it LowerCase
From this
Map<String, String> foo = {
"A" : "valueOne",
"B" : "valueTwo",
};
print(foo); // output: {"A" : "valueOne", "B" : "valueTwo"}
To this
print(foo); // output: {"a" : "valueOne", "b" : "valueTwo"}
Here's the method I tried:
Map<String, String> foo = {
"A" : "valueOne",
"B" : "valueTwo",
};
foo.forEach((key, value) {
key = key.toString().toLowerCase();
value = value;
});
... something something
also tried to assign the forEach as a value
Map<String, String> foo = {
"A" : "valueOne",
"B" : "valueTwo",
};
var bar = foo.forEach((key, value) {
key = key.toString().toLowerCase();
value = value;
});
print(bar); // Failed because forEach Datatype is `void`
... something something
also tried
Map<String, String> foo = {
"A" : "valueOne",
"B" : "valueTwo",
};
foo.forEach((key, value) {
key = key.toString().toLowerCase();
value = value;
Map<String, String> bar = {key: value};
print(bar); // `Output: {a: valueOne} {b: valueTwo}` <- is not what I was looking for.
});
... something something
Any suggestions on what to do Next?
CodePudding user response:
I found the answer already.
Map<String, String> foo = {
"A": "valueOne",
"B": "valueTwo",
};
Map<String, dynamic> bar = {};
foo.keys.toList().forEach((key) {
bar.addAll({key.toString().toLowerCase(): foo[key]});
});
print(bar);
}
CodePudding user response:
First of all, you cannot change a key, you have to remove the old key and add a new key instead.
You can then choose to either update the existing map, or build a new one.
Creating a new one is simpler:
var newMap = {for (var e in oldMap.entries) e.key.toLowerCase() : e.value};
We ignore the risk of having existing keys which are equal after calling toLowerCase, like "Foo", "FOO" and "foo".
Updating the existing map is trickier, but if we ignore the same risks, it can be something like:
// Snapshot the keys to avoid concurrent modification error when iterating.
for (var e in map.entries.toList()) {
var key = e.key;
var lc = key.toLowerCase();
if (lc != key) {
map[lc] = e.value;
map.remove(key);
}
}
Alternatively, use a CanonicalizedMap to begin with, which does the lower-casing for you (and allows you to look up with any casing of the same text).
