2014-03-24 40 views
0

我有一個Map,我想通過valueskeys,並用某些其他對象替換任何符合某些設置條件的特定對象,所以如果我找到一個符合特定條件的關鍵字。
我想交換一個不同的對象,該對象仍然指向地圖中的相同值對象,類似地,如果我找到一個要替換的值,我希望原始密鑰指向替換值。
下面是一些適用於簡化示例的代碼,但它看起來相當難看,是否有更好的方法來實現這一點,這意味着一種方法,它不要求您提取要替換的每個鍵和值,然後編寫替換回
能夠只迭代一次地圖而不是遍歷密鑰,然後遍歷所有要替換的密鑰和值,會更好嗎?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{} 

回答

2

我認爲這確實是相同的:

Map newMap = {}; 
    m.forEach((k, v) { 
    var key = k; 
    var value = v; 
    if(m[k] is A) { 
     value = new Object(); 
    } 
    if(k.startsWith('t')) { 
     key = k.replaceFirst('t', ''); 
    } 
    newMap[key]=value; 
    }); 
+0

嗯,你讓我重新思考我的問題,謝謝。也許創建一個新地圖是一種方法,而不是替換現有地圖中的鍵和值。 – 0xor1

+0

我想過'新的Map.fromIterable()你可以應用映射,但是你不能在映射函數中訪問'key'和'value',而只能在'key'映射函數中使用'key',值'映射函數中的值。 –

+0

haivng看着我的代碼不幸的是我不能使用這個解決方案,因爲我沒有訪問原始地圖引用來覆蓋它將返回的新地圖,我確實需要單獨替換現有地圖中的每個單獨的鍵/值。嗯,沒關係,儘管如此,仍然是許多其他用例的不錯解決方案 – 0xor1