从字典中删除给定值的键

时间:2016-05-28 17:27:00

标签: ios swift dictionary optimization

如何从字典中删除值为X的字符?我需要一个dictionary.removeKeyForValue(...)函数。

我想优化以下代码。我有一个与某个类别相关联的文本和一个将所有关键字与类别相关联的字典。虽然我的文字已经分类,但我想检查它是否属于不同的类别。

function lightboxshow(object) {
    var imageccbox = document.getElementById(object);

    var img = imageccbox.getElementsByTagName('img')[0];
    img.setAttribute('src', 'test.jpg');

    imageccbox.style.display='block';
    setTimeout(function() {imageccbox.getElementsByClassName("imageccboxpicture")[0].style.opacity = 1.0;}, 25);
     window.location.hash = object;
}

3 个答案:

答案 0 :(得分:4)

要从具有特定key的字典中删除所有value,您可以使用带有for子句的where循环来选择key s删除然后指定nil以删除它们:

var categoryRules = ["hi" : "greeting", "hello" : "greeting", "jogging" : "activity", "joy" : "feeling"]

for (key, value) in categoryRules where value == "greeting" {
    categoryRules[key] = nil
}

print(categoryRules)  // ["jogging": "activity", "joy": "feeling"]

您可以添加removeKeysForValue添加Dictionary的扩展程序,该扩展程序适用于Equatable的值(可与==进行比较):

extension Dictionary where Value: Equatable {
    mutating func removeKeysForValue(value: Value) {
        for (key, val) in self where val == value {
            self[key] = nil
        }
    }
}

var categoryRules = ["hi" : "greeting", "hello" : "greeting", "jogging" : "activity", "joy" : "feeling"]

categoryRules.removeKeysForValue("greeting")

print(categoryRules)  // ["jogging": "activity", "joy": "feeling"]

答案 1 :(得分:1)

这是我发现优雅使用过滤器的替代解决方案。

var categoryRules = ["hi" : "greeting", "hello" : "greeting", "jogging" : "activity", "joy" : "feeling"]
let keysToRemove = dict.keys.filter { dict[$0]! == "greeting" }

for key in keysToRemove {
  dict.removeValueForKey(key)
}

// categoryRules = ["jogging": "activity", "joy": "feeling"]

keysToRemove将有“hi”和“hello”,因为它们匹配给定值为“greeting”的过滤器。

修改

OP提到他想要一个dictionary.removeKeyForValue()函数。如果您打算经常执行此操作,则可以使用上述代码创建扩展名以提高可读性并避免代码重复。

示例:

extension Dictionary {
  mutating func removeKeysForValue(value: NSObject) {
    let keysToRemove = self.keys.filter { self[$0]! as! NSObject == value }

    for key in keysToRemove {
      self.removeValueForKey(key)
    }
  }
}

var dict = ["hi" : "greeting", "hello" : "greeting", "jogging" : "activity", "joy" : "feeling"]

dict.removeKeysForValue("greeting") // dict = ["jogging": "activity", "joy": "feeling"]

答案 2 :(得分:0)

由于 O(n)时间从字典中删除键(其中 n 是字典的大小),因此创建它可能是个更好的主意字典列表(而不仅仅是一个。)每个字典都会排除必要的元素。因此,当从字典中查找值时,您只需选择正确的字典。

这将具有更好的性能,然后在运行时从字典中删除键。特别是在循环中多次查找时。