飞镖,一种替换地图中的键和值的好方法?

时间:2014-03-24 13:29:51

标签: map dart

我有一个Map,我希望同时检查valueskeys,并用其他一些对象替换任何符合某些设置条件的特定对象,所以如果我找到符合特定标准的钥匙 我想将该键交换为仍然指向地图中相同值对象的其他对象,类似地,如果我找到要替换的值,我希望原始键指向替换值。
下面是一些适用于简化示例的代码,但它看起来非常难看,是否有更好的方法来实现这一点,这意味着一种方法并不要求您提取要替换的每个键和值,然后编写替换回来。
能够只迭代一次映射而不是遍历键,然后迭代所有要替换的键和值会更好吗?

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{}

1 个答案:

答案 0 :(得分: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;
  });