如何将变量与 NSArray 中的 NSDictionary 中的对象进行比较?
Posted
技术标签:
【中文标题】如何将变量与 NSArray 中的 NSDictionary 中的对象进行比较?【英文标题】:How to compare a variable to an object inside an NSDictionary that is inside an NSArray? 【发布时间】:2018-06-18 06:13:38 【问题描述】:我需要将 NSString 变量与存储在 NSMutableArray 内的 NSDictionary 中的对象进行比较
我的 NSMutableArray 包含 Manu NSDictionaries,每个都有两个 NSString 对象
在向 Array 添加更多元素之前,我想确保它尚未在其中,但那时我只知道其中一个对象名称
例如
NSDictionary 为键 @"bar" 保存 @"foo",为键 @"fibbel" 保存 @"Jongel"
现在我想构建一个新的 NSDictionary 并将其插入到数组中,但前提是 NSString @"foo" 不在数组内的字典中
我找不到任何文档如何解决数组中的 NSDictionary,我可以找到文档如何使用 NSArray *myArray = dict[0] 查找 nsdictionary 中的数组,然后循环,但这就是我需要的走另一条路
如何做到这一点?
这是我正在尝试的,但我无法做到
+ (void) splitOutCategories:(NSMutableArray *)reveProducts
if([NWTillHelper isDebug] == 1)
NSLog(@"%s entered with array count = %lu", __PRETTY_FUNCTION__, reveProducts.count);
NSMutableArray *reveCollections = [[NSMutableArray alloc] init];
for (NSDictionary *dictProduct in reveProducts)
NSMutableDictionary *dictReveCollections = [[NSMutableDictionary alloc] init];
NSArray *arrLocales = dictProduct[@"locales"];
for (NSDictionary *dictLocale in arrLocales)
NSArray *arrCategories = dictLocale[@"categories"];
NSArray *arrImages = dictLocale[@"images"];
if(arrCategories.count < 1)
// Nothing to do
else if (arrCategories.count == 1)
if(![reveCollections containsObject:arrCategories[0]])
// Here we need to build the entire dict and insert into the array
NSString *fcTitle = arrCategories[0];
NSString *fcImageUrl = arrImages[0];
[dictReveCollections setObject:fcTitle forKey:@"fcTitle"];
[dictReveCollections setObject:fcImageUrl forKey:@"fcImageUrl"];
[reveCollections addObject:dictReveCollections];
else if (arrCategories.count > 1)
if(![reveCollections containsObject:arrCategories[1]])
NSString *fcTitle = arrCategories[1];
NSString *fcImageUrl = nil;
if(arrImages.count < 1)
fcImageUrl = @"https://xxxxyyyyy.png";
else
fcImageUrl = arrImages[0];
[dictReveCollections setObject:fcTitle forKey:@"fcTitle"];
[dictReveCollections setObject:fcImageUrl forKey:@"fcImageUrl"];
[reveCollections addObject:dictReveCollections];
NSLog(@"reveCollectionsArray = \r\n%@", reveCollections);
NSLog(@"reveCollectionsArrayCount = %lu", reveCollections.count);
【问题讨论】:
你能展示整个模型的样本结构吗?从最上面的数组开始? Searching NSArray of NSDictionary objects的可能重复 【参考方案1】:在向数组添加更多元素之前,我想确保它还没有在其中
这里的解决方案取决于什么是独特的。正如您所描述的,听起来只有 NSDictionary 键/值对的值需要是唯一的(“foo”、“Jongel”)。如果是这种情况,那么您可以非常轻松地解决这个问题,方法是使用 NSMutableSet 跟踪您已经接受的值。
这样的方法会奏效:
@interface CollectionExample ()
@property (strong, nonatomic) NSMutableArray *reveCollections;
@property (strong, nonatomic) NSMutableSet *storedValues;
@end
@implementation CollectionExample
- (instancetype)init
self = [super init];
if (self)
_storedValues = [NSMutableSet set];
_reveCollections = [NSMutableArray array];
return self;
- (BOOL)valueAlreadyExists:(NSString *)newValue
return [self.storedValues containsObject:newValue];
- (void)addNewKeyValuePair:(NSString *)key value:(NSString *)value
if ([self valueAlreadyExists:value])
// handle this however you'd like
return;
NSDictionary *dict = @key: value;
[self.reveCollections addObject:dict];
[self.storedValues insertObject:value];
@end
但是,如果需要唯一的是键/值对,那么您必须遍历数组并遍历数组中的每个键/值对每本词典。像这样的东西应该可以工作:
- (BOOL)valueAlreadyExists:(NSString *)newKey value:(NSString *)newValue
BOOL foundPair = NO;
for (NSDictionary *dict in self.reveCollections)
[dict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop)
if ([newKey isEqualToString:key] && [newValue isEqualToString:obj])
foundPair = YES;
*stop = YES;
return;
];
return foundPair;
【讨论】:
以上是关于如何将变量与 NSArray 中的 NSDictionary 中的对象进行比较?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 NSArray 中的对象添加到 NSMutableArray 的末尾?
如何遍历NSMutableArray 里面的NSArray的值
如何将 NSArray 拆分为按字母顺序排列的部分以与索引表视图一起使用
如何将自定义对象的 NSArray 归档到 Objective-C 中的文件
如何将整个索引路径、上一个、上一个和当前选定的索引路径值存储到 didSelectRowAtIndexPath 中的 NSArray:方法