0
我有一個Map
,我想通過values
和keys
,並用某些其他對象替換任何符合某些設置條件的特定對象,所以如果我找到一個符合特定條件的關鍵字。
我想交換一個不同的對象,該對象仍然指向地圖中的相同值對象,類似地,如果我找到一個要替換的值,我希望原始密鑰指向替換值。
下面是一些適用於簡化示例的代碼,但它看起來相當難看,是否有更好的方法來實現這一點,這意味着一種方法,它不要求您提取要替換的每個鍵和值,然後編寫替換回
能夠只迭代一次地圖而不是遍歷密鑰,然後遍歷所有要替換的密鑰和值,會更好嗎?dart,替換地圖中的鍵和值的好方法?
void main(){
//replace all values of instance A with an Object and all keys starting with "t" with the same key minus the "t"
var m = {
"one": new A(),
"two": new A(),
"three": new B(),
"four": new B()
};
mapKeyAndValueSwapper(m,
keyMeetsCondition: (k) => k.startsWith("t"),
valueMeetsCondition: (v) => v is A,
keyReplacer: (k) => k.replaceFirst("t", ""),
valueReplacer: (v) => new Object());
print(m);
}
mapKeyAndValueSwapper(Map m, {bool keyMeetsCondition(key), bool valueMeetsCondition(value), dynamic keyReplacer(key), dynamic valueReplacer(value)}){
var keysToReplace = [];
var keysToReplaceValuesFor = [];
var keys = m.keys;
keys.forEach((k){
if(keyMeetsCondition != null){
if(keyMeetsCondition(k)){
keysToReplace.add(k);
}
}
if(valueMeetsCondition != null){
if(valueMeetsCondition(m[k])){
keysToReplaceValuesFor.add(k);
}
}
});
keysToReplaceValuesFor.forEach((k){
m[k] = valueReplacer(m[k]);
});
keysToReplace.forEach((k){
m[keyReplacer(k)] = m.remove(k);
});
}
class A{}
class B{}
嗯,你讓我重新思考我的問題,謝謝。也許創建一個新地圖是一種方法,而不是替換現有地圖中的鍵和值。 – 0xor1
我想過'新的Map.fromIterable()你可以應用映射,但是你不能在映射函數中訪問'key'和'value',而只能在'key'映射函數中使用'key',值'映射函數中的值。 –
haivng看着我的代碼不幸的是我不能使用這個解決方案,因爲我沒有訪問原始地圖引用來覆蓋它將返回的新地圖,我確實需要單獨替換現有地圖中的每個單獨的鍵/值。嗯,沒關係,儘管如此,仍然是許多其他用例的不錯解決方案 – 0xor1