如何将变量与 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 中的文件

Array 与 NSArray 的不同点对比表

如何将整个索引路径、上一个、上一个和当前选定的索引路径值存储到 didSelectRowAtIndexPath 中的 NSArray:方法