2013-04-05 2 views
9

У меня есть NSArray с NSDictionaries. Один из ключей словарей в одном из массивов содержит значение. Я хочу получить NSDictionary с этим значением.Извлечь NSDictionary из NSArray, где ключ словаря имеет значение X

Мой массив:

Array: (
     { 
     DisplayName = "level"; 
     InternalName = "Number 2"; 
     NumberValue = 1; 
    }, 
     { 
     DisplayName = "PurchaseAmount"; 
     InternalName = "Number 1"; 
     NumberValue = 3500; 
    } 
) 

Итак, я хотел бы получить словарь, который содержит DisplayName набор для PurchaseAmount (чувствительно к регистру).

Как это сделать?

+3

Вы должны быть в состоянии использовать 'NSPredicate' для этого. [См. Аналогичный пример здесь] (http://stackoverflow.com/q/958622/119114). – Nate

+0

Thnx для наконечника. Я добавлю решение, которое я использовал для ответа –

ответ

17

Следующая решена моя проблема:

NSArray *filtered = [promotions filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(DisplayName == %@)", @"PurchaseAmount"]]; 
NSDictionary *item = [filtered objectAtIndex:0]; 

Thnx в пользователь Нейт за комментарий к моему вопросу!

+3

На самом деле, и этот ответ, и [особенно ответ lindinax] (http://stackoverflow.com/a/15831638/119114) лучше, чем тот, который вы приняли. Ответ Бхаргави проверяет, что ключ * содержит * строку, но ваш вопрос задал результат с ключом, равным определенному значению. В общем, эти два не то же самое. Это может не повлиять на ваши ключевые имена, но для других это очень хорошо. – Nate

+0

Вы отвечаете на свой вопрос неправильно, как вы просили «нечувствительность к регистру». Тем более, что вы приняли его как принятый. – lindinax

5

Используйте NSPredicate таким образом

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DisplayName LIKE[cd] 'PurchaseAmount' "]; 
NSArray *filter = [array filteredArrayUsingPredicate:predicate]; 
NSLog(@"%@",filter); 

Здесь фильтр проведет свои словари, который содержит отображаемое_имя установлен PurchaseAmount (чувствительно к регистру)

+0

Nice! Спасибо. Лучше, чем мое недавно найденное решение. –

+0

На самом деле, это ** не **, что задал вопрос. Ваш предикат находит совпадения, в которых ключ ** содержит ** строку. Если есть еще один ключ, который является надмножеством этого имени ключа, ваш фильтр дает * false positive *. (например, 'DisplayName =" PurchaseAmountWithTax "';) – Nate

+0

Вы правы, хотя решение Bhargavi действительно полезно! –

9

LIKE [кд] также будет делать это

NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(DisplayName LIKE[cd] %@)", @"purchaseAmount"]]; 

вернулся

<NSArray>(
    { 
     DisplayName = PurchaseAmount; 
     InternaName = "Number 1"; 
     NumberValue = 3500; 
    } 
) 
0
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"DisplayName == 'level'"]; 
    NSArray *arrOutput = [[Array filteredArrayUsingPredicate:predicate] mutableCopy]; 

с помощью указанных выше 2 линий вы получите все словарь с DisplayName = "PurchaseAmount"

3

Ответить в Swift,

let predicate = NSPredicate(format: "name contains[cd] %@", stringLookingFor) 
let newList = data .filteredArrayUsingPredicate(predicate) 

NSArray Данные выглядит следующим образом

[ 
{ 
    name = Carlos, 
    total = 9 
}, 
{ 
    name = Willy, 
    total = 2 
} 
] 
Смежные вопросы