从另一个获取 NSDictionary 的 NSArray,其中包含原始键集的子集

Posted

技术标签:

【中文标题】从另一个获取 NSDictionary 的 NSArray,其中包含原始键集的子集【英文标题】:Obtain a NSArray of NSDictionary, from another one, with a subset of the original set of keys 【发布时间】:2013-09-16 10:57:32 【问题描述】:

从这个 NSDictionary 的 NSArray 中获取的聪明方法是什么:

[

Key1: Value1,
Key2: Value2,
Key3: Value3,
Key4: Value4
,

Key1: Value11,
Key2: Value12,
Key3: Value13,
Key4: Value14
,

Key1: Value21,
Key2: Value22,
Key3: Value23,
Key4: Value24

]

另一个包含原始键集子集的 NSDictionary 的 NSArray。例如:

[
    
    Key1: Value1,
    Key3: Value3
    ,
    
    Key1: Value11,
    Key3: Value13
    ,
    
    Key1: Value21,
    Key3: Value23
    
    ]

谢谢。

【问题讨论】:

【参考方案1】:

冒昧地创建了一个初始数组来工作......

NSArray* allKeys = @[@"key1",@"key2",@"key3",@"key4",@"key5"];
NSArray* allObjs = @[@"a",@"b",@"c",@"d",@"e"];
NSMutableArray* originalArray = [NSMutableArray arrayWithCapacity:4];
for (int i=0; i<4; i++) 
    NSRange subRange = NSMakeRange(0, i+1);
    [originalArray addObject:[NSDictionary dictionaryWithObjects:[allObjs subarrayWithRange:subRange] forKeys:[allKeys subarrayWithRange:subRange]]];

NSLog(@"origianl array = %@",originalArray);

NSArray* keys = @[@"key1",@"key3"];
__block NSMutableArray* newArr = [NSMutableArray arrayWithCapacity:4];
[originalArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    [newArr addObject:[NSDictionary dictionaryWithObjects:[obj objectsForKeys:keys notFoundMarker:[NSNull null]] forKeys:keys]];
];

NSLog(@"new array = %@",newArr);

在前后给出以下内容:

2013-09-16 13:20:14.129 GammonPos[910:11303] origianl array = (
    
    key1 = a;
,
    
    key1 = a;
    key2 = b;
,
    
    key1 = a;
    key2 = b;
    key3 = c;
,
    
    key1 = a;
    key2 = b;
    key3 = c;
    key4 = d;

)
2013-09-16 13:20:14.131 GammonPos[910:11303] new array = (
    
    key1 = a;
    key3 = "<null>";
,
    
    key1 = a;
    key3 = "<null>";
,
    
    key1 = a;
    key3 = c;
,
    
    key1 = a;
    key3 = c;

)

【讨论】:

Don't see why this is a worse 比接受的答案,如果找不到具有其中一个键的对象,则会引发 NSInvalidArgumentException(因为它会尝试将 nil 添加到 subDictionary)。 我更喜欢这个解决方案,因为它更紧凑。【参考方案2】:

枚举数组并为每个字典创建一个仅使用所需键的新字典。将这些新字典添加到新数组中。

// Assume initialArray is the array you start with
NSMutableArray *newArray = [NSMutableArray alloc] initWithCapacity:[initialArray count]];

for (NSDictionary *dict in initialArray) 
    NSDictionary *subDictionary = @@"Key1" : [dict objectForKey:@"Key1"],
                                    @"Key3" : [dict objectForKey:@"Key3"];
    [newArray addObject:subDictionary];

现在newArray 将包含仅包含您指定的键的字典。

【讨论】:

聪明在什么方面?如果速度是一个问题,您可以使用 NSArray 块枚举方法同时执行此操作,如果内存是一个问题,您可以将此代码示例包装在自动释放池中。这行得通。它简单且高效。在分析和找到真正的热点之后,您可以调整的任何其他内容。

以上是关于从另一个获取 NSDictionary 的 NSArray,其中包含原始键集的子集的主要内容,如果未能解决你的问题,请参考以下文章

JSON 匹配 NSString 和 NSDictionary

通过过滤另一个 NSDictionary 来获取一个 NSDictionary

Swift iOS NSDictionary setValue 崩溃 - 但为啥?

如何从另一个数组创建一个对象的两个 valueForKey 元素的 NSArray

如何获取 NSDictionary 中的第一个元素?

获取 NSManagedObject 的属性作为 NSDictionary