如何使用任何东西在数组或字典中查找对象
Posted
技术标签:
【中文标题】如何使用任何东西在数组或字典中查找对象【英文标题】:How to find object in Array or dictionary using anything 【发布时间】:2021-06-24 12:51:26 【问题描述】:我有新工作,目前在objective-c上,我不能使用struct等。
请有人帮助我,我需要在 NSArray 中找到价值(或者如果这很容易,我可以将其更改为 NSDictionary)。
I've got NSArray 有 4 个类似的字典。我有子类别-> ID 的密钥。 NSString *titleKey = paramsCell[@"category"];
我需要在所有这些字典中找到此 ID 并捕获确认此 ID 的“Locale”。
NSString *predicate2 = [NSString stringWithFormat:@"_subcategories.id == \"%@\"",titleKey];
NSArray *tempArray = [_categoryDictionary filteredArrayUsingPredicate:[NSPredicate predicateWithFormat: predicate2]];
我尝试了什么:
^^^^ 不行
我尝试将谓词更改为
'NSPredicate *predicate = [NSPredicate predicateWithFormat:titleKey];'
我完全看不懂这些%@@%%""@"%"@%"@,我想哭.....
请,有人可以解释我如何解决它。 我想它很快看起来像 .map$0.subcategories
添加:
for @Larme
我需要在 _categoryDic(可以是 Array 或 Dict,我可以更改它)中找到等于我的 titleKey 的 Subcategories->id。并捕获子类别-> 1 个带有 id 的字典中的语言环境。
我的情况: 我们有细胞,所以当我们从服务器收到它时,它们没有名字。我们只收到单元格的类别 ID。我们应该将它的类别与我们的字典进行比较,并将标题放在单元格上(在我们的 categoryDic-> 语言环境中)
【问题讨论】:
paramsCell[@"category"]
:根据您的屏幕截图,这是NSArray
,而不是NSString
。最后,你到底想要什么? locale
键的值是 NSString
?
@Larme,很抱歉机器人的详细描述。这是方法 cellForRowAtIndexPath,所以 titleKey 只能是 NSString。我试图在 'Locale' 中的 _categoryDictionary 值中找到并将其发送到标签,在 _CategoryDictionary 中我有所有类别。我的手机只有类别的 ID。我需要比较我的单元格类别 ID(标题键与 categoryDic->Subcategories->ID 并显示在我的标签 categoryDic->subCategories->Locale
对不起,我的意思是_categoryDictionary[@"subcategories"]
是NSArray
,所以你不能在上面做subcategories.id
。你是说它也是 NSDictionaries 的 NSArray 吗?你能打印_category_Dictionary
吗?并告诉我们你到底想要什么?如果您可以自己创建最终输出:NSArray *output = ...
,或NSDictionary *output = ...
或NSString *output = ...
?
@Larme,我尝试过使用数组和字典。如果您需要,我可以将其更改为任何格式。
没关系,我们只需要知道你的数据到底长什么样。
【参考方案1】:
仅在处理 NSArray 时很少需要 NSPredicate。 NSPredicate 的功能主要是针对 Core Data(它可以将它们转换为数据库上的 SQL 调用而不是线性搜索),或者在某些情况下,您有一个非常复杂或高度动态的查询,更容易表示为谓词。
如果您在 Swift 中将其编写为数组上的简单映射/过滤器,那么在 ObjC 中最好的方法是 for-in 循环。
NSMutableArray *results = [NSMutableArray new];
for (NSDictionary *element in _categoryDictionary)
if ( ... check your condition ... )
id value = ... convert element to what you want ...
[results addObject: value];
(您的问题对于您要过滤的确切内容以及您想要的转换非常困惑,所以我只提供标准循环结构。您可以填写您的具体信息。)
如果你真的需要一个谓词,我可以用那种形式重写它,但你需要更准确地了解你的输入数据是什么以及你期望的输出是什么。您希望将其作为一个明确的示例而不是屏幕截图给出,“这是 ObjC 语法中的输入数组,这是 ObjC 语法中的输出数组”。 (但我认为您不需要为此使用谓词。)
【讨论】:
谢谢罗伯。我正在尝试这样: NSMutableArray *results = [NSMutableArray new]; for (NSDictionary *element in _categoryDictionary) if (element[@"subcategories.id"] == titleKey) id value = element[@"subcategories"][@"locale"][@"title"]; cell.textLabel.text == 值; 好的……我不确定你希望这样做。您没有将结果添加到results
数组中,而是一遍又一遍地检查text == value
。 (您应该会看到一条警告,说明您没有使用 ==
的结果。不要忽略警告。)
当我使用 element[@"subcategories.id"]] - 它返回 nil,如果我使用 element[@"subcategories"][@"id"]]; - 它删除应用程序。我应该怎么写正确?)它几乎是最终的!!!))))
这是pastebin.com/7JW7ieu6,您似乎并不关心对象的层次结构。这就是为什么我问你更多的细节。 element[@"subcategories.id"]]
返回零?这很正常。为什么你期望它会返回价值?旁注,如果您只想要一个值,请不要将results
用作NSArray
,而是直接用作NSString
。并命名_categoryDictionary
,我希望它是NSDictionary
,但实际上它是NSArray
,误导!
__NSSingleObjectArrayI
是 Apple 的隐藏子类。这意味着它是一个单一对象的数组,并且它不是可变的(即不可变的)。在“可见”类中,它只是一个NSArray
。【参考方案2】:
感谢@Larme 和@Rob Napier 的帮助!
NSString *targetId = @"toFind";
NSMutableArray *results = [NSMutableArray new];
for (NSDictionary *element in _categoryDictionary)
NSArray *subcategories = element[@"subcategories"];
for (NSDictionary *aSubcategory in subcategories)
if ([aSubcategory[@"id"] isEqualToString:targetId])
[results addObject:aSubcategory[@"locale"]];
【讨论】:
以上是关于如何使用任何东西在数组或字典中查找对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 numpy 数组上定义一个使用数组索引查找字典的函数?