2016-07-05 2 views
1

Как я могу удалить dict из массива словарей?Удалить значение из массива словарей

У меня есть набор словарей, таких как: var posts = [[String:String]]() - и я хотел бы удалить словарь с определенным ключом, как бы я мог продолжить? Я знаю, что я могу удалить значение из стандартного массива, выполнив Array.removeAtIndex(_:) или ключ словаря, выполнив key.removeValue(), но массив словарей более сложный.

Заранее благодарен!

+0

Что вы подразумеваете под «Я хотел бы удалить словарь с определенным ключом»? Если у вас есть массив из 3 словарей, а у 2 из них есть ключ 'foo', вы хотите, чтобы все они были удалены? Только первый? – Alexander

+0

@AMomchilov Я хочу удалить словарь с помощью специального ключа «foo», поскольку я знаю, что все ключи в массиве словарей являются уникальными ключами. – askaale

ответ

3

Если я правильно понял вопросы, это должно работать

var posts: [[String:String]] = [ 
    ["a": "1", "b": "2"], 
    ["x": "3", "y": "4"], 
    ["a": "5", "y": "6"] 
] 

for (index, var post) in posts.enumerate() { 
    post.removeValueForKey("a") 
    posts[index] = post 
} 

/* 
This will posts = [ 
    ["b": "2"], 
    ["y": "4", "x": "3"], 
    ["y": "6"] 
] 
*/ 

Так как ваш словарь и массив оберточной типы значений просто изменяя post внутри цикла будет изменять копию словаря (мы создали его объявив его с помощью var), поэтому в заключение нам нужно установить значение на index на новую версию словаря

+1

Это работает! Спасибо огромное! – askaale

2

Удаление всех словарей с заданным ключом

let input = [ 
    [ 
     "Key 1" : "Value 1", 
     "Key 2" : "Value 2", 
    ], 
    [ 
     "Key 1" : "Value 1", 
     "Key 2" : "Value 2", 
    ], 
    [ 
     "Key 1" : "Value 1", 
     "Key 2" : "Value 2", 
     "Key 3" : "Value 3", 
    ], 
] 

let keyToRemove = "Key 3" 

//keep dicts only if their value for keyToRemove is nil (meaning key doesn't exist) 
let result = input.filter{ $0[keyToRemove] == nil } 

print("Input:\n") 
dump(input) 
print("\n\nAfter removing all dicts which have the key \"\(keyToRemove)\":\n") 
dump(result) 

Вы можете увидеть этот код в действии here.

Удаление только первый словарь с заданным ключом

var result = input 
//keep dicts only if their value for keyToRemove is nil (meaning key doesn't exist) 
for (index, dict) in result.enumerate() { 
    if (dict[keyToRemove] != nil) { result.removeAtIndex(index) } 
} 

print("Input:\n") 
dump(input) 
print("\n\nAfter removing all dicts which have the key \"\(keyToRemove)\":\n") 
dump(result) 

Вы можете увидеть этот код в действии here.

+0

Первый код (что я ищу), похоже, не работает. Я попытался использовать этот код и впоследствии распечатать массив словарей, без везения. Данные не были удалены. Это странно .. – askaale

+0

У вас есть ссылка ниже этого фрагмента кода, который показывает, что он отлично работает – Alexander

Смежные вопросы