我有NSDictionary与对象。 NSDictionary由json组成(您可以在下面看到)。我需要使用id的名称填充我的表视图。 id可以重复。这意味着我可以有几个“名称”,其id等于0.我应该通过键获得字典中的某个值。这是我的NSDictionary:
{
name = "smth1";
id = 0;
},
{
name = "smth2";
id = 1;
},
{
name = "smth3";
id = 2;
},
{
name = "smth4";
id = 2;
},
...
例如,我想得到关键字“name”的值,其中id为2.然后我将得到name =“smth3”和name =“smth4”。通常,我试图用嵌套数据填充我的表视图组件。我怎样才能做到这一点?任何提示,想法。谢谢。
答案 0 :(得分:1)
实际上你会显示一个字典数组,其中每个字典有2个键。
您可以使用NSArray函数indexOfObjectPassingTest
。该代码可能看起来像这样(从NSArray开始):
int idToFind = 2;
NSArray *dictArray = @[@{@"name": @"smth1",
@"id": @(0)},
@{@"name": @"smth2",
@"id": @(1)},
@{@"name": @"smth3",
@"id": @(2)}
];
NSUInteger dictIndex =
[dictArray indexOfObjectPassingTest: ^BOOL(
NSDictionary *dict,
NSUInteger idx,
BOOL *stop) {
return [dict[@"id"] intValue] == idToFind;
}];
if (dictIndex != NSNotFound) {
NSLog(@"Found id %d with name %@", idToFind, dictArray[dictIndex][@"name"]);
}
}
如果您需要匹配所有项目,则需要使用NSArray方法indexesOfObjectsPassingTest
。找到数组中匹配的所有项目。
该代码如下所示:
int idToFind = 2;
NSArray *dictArray = @[@{@"name": @"smth1",
@"id": @(0)},
@{@"name": @"Fred",
@"id": @(2)},
@{@"name": @"smth2",
@"id": @(1)},
@{@"name": @"smth3",
@"id": @(2)},
];
NSIndexSet *dictIndexes;
dictIndexes =
[dictArray indexesOfObjectsPassingTest: ^BOOL(NSDictionary *dict,
NSUInteger idx,
BOOL *stop)
{
return [dict[@"id"] intValue] == idToFind;
}];
if (dictIndexes.count == 0) {
NSLog(@"No matches found");
}
[dictIndexes enumerateIndexesUsingBlock:^(NSUInteger index,
BOOL * _Nonnull stop)
{
NSLog(@"Found id=%@ with name \"%@\" at index %lu",
dictArray[index][@"id"],
dictArray[index][@"name"],
index);
}];
上述两种方法都使用了一种方法。该块包含您编写的代码,该代码返回与您所需搜索条件匹配的项目的BOOL。
使用块的搜索/排序方法非常灵活,因为您可以提供任何想要进行匹配/比较的代码。
indexOfObjectPassingTest
方法搜索数组中的单个对象,并在找到第一个匹配项时停止。
相反,indexesOfObjectsPassingTest
函数将匹配多个项目。它返回一个NSIndexSet
,一个用于索引NSArrays的特殊类。
有一个函数enumerateIndexesUsingBlock,它为数组中指定的每个索引调用一段代码。
我们也可以使用方法objectsAtIndexes
仅提取数组中结果索引集中列出的元素,然后使用for...in
循环遍历项目。该代码看起来像这样:
NSArray *filteredArray = [dictArray objectsAtIndexes: dictIndexes];
for (NSDictionary *aDict in filteredArray) {
NSLog(@"Found id=%@ with name \"%@\"", aDict[@"id"], aDict[@"name"]);
}
请注意,这种事情在Swift中更简单,更清晰。我们可以在数组上使用filter
语句,并提供一个闭包,用于选择符合我们搜索条件的项目