【问题标题】:Grab all values in NSDictionary inside an NSArray在 NSArray 中获取 NSDictionary 中的所有值
【发布时间】:2011-06-29 11:36:21
【问题描述】:

我有一个充满 NSDictionary 对象的 NSArray,每个 NSDictionary 里面都有一个唯一的 ID。我想根据 ID 查找特定词典,并在我自己的词典中获取该词典的所有信息。

myArray 包含:

[index 0] myDictionary object
  name = apple,
  weight = 1 pound,
  number = 294,

[index 1] myDictionary object
  name = pear,
  weight = .5 pound,
  number = 149,

[index 3] myDictionary object (etc...)

我想获取第二个字典对象的名称和权重(我不知道对象的索引...如果只有两个字典,我可以从[myArray objectAtIndex:1] 制作字典)

假设我知道数字 149。我怎样才能将第二个 myDictionary 对象从 myArray 中取出到新的 NSDictionary 中?

【问题讨论】:

  • 嗯...可能是 stackoverflow.com/questions/2457495stackoverflow.com/questions/958622 的欺骗,但我仍然不一定喜欢这些答案中的方法(虽然还没有深入阅读)。我目前在 Core Data 中的整个应用程序中执行三到四个查询,但我宁愿只能够使用一组 dicts 完成所有操作。我应该在这里使用 NSPredicate 吗?
  • myDictionary 对象实际上是 NSDictionary 对象还是自定义对象?
  • 我认为@Chuck 的回答在这种情况下是正确的,我确实知道您可以在这里使用 KVC/NSPredicate,但我认为我错了。

标签: iphone objective-c nsarray nsdictionary


【解决方案1】:

作为 Jacob 答案的替代方案,您也可以只要求字典查找对象:

NSPredicate *finder = [NSPredicate predicateWithFormat:@"number = 149"];
NSDictionary *targetDictionary = [[array filteredArrayUsingPredicate:finder] lastObject];

【讨论】:

  • @Chuck 这真的有用吗?我的意思是,NSPredicate中指定的字段不需要对应当前对象上的方法吗?由于对象只响应-objectForKey:,而不是-number,我认为它不会起作用,但我可能又错了......
  • 会试试这个...我喜欢这样做的想法,因为我将不得不在几个不同的地方这样做,而且我讨厌循环(当我可以避免它们时) )。
  • @Jacob Relkin:我也可能是错的。我认为 NSPredicate 使用了 KVC,它适用于 NSDictionaries 和对象。但我目前无法测试代码。
  • @Chuck 哦,你的意思是它会在NSDictionary 上调用valueForKey:?嗯,也许它实际上工作...... +1 给你!
  • @查克尼斯。我会记住这一点以供将来参考!谢谢!
【解决方案2】:

您需要遍历 NSArray 中的每个 NSDictionary 对象:

- (NSDictionary *) findDictByNumber:(NSInteger) num {
   for(NSDictionary *dict in myArray) {
     if([[dict objectForKey:@"number"] intValue] == num) 
        return [NSDictionary dictionaryWithObjectsAndKeys:[dict objectForKey:@"weight"], @"weight", [dict objectForKey:@"name"], @"name", nil];
   }
   return nil;
}

【讨论】:

  • 这不会太糟糕,不过我希望避免这样做,因为我认为这种事情会更容易做(这对我来说似乎是一种很常见的模式...)。好吧,也许更容易不是正确的词 - 更少的代码,也许?
  • 我先试试 Chuck 的方法(一会儿),看看能不能行。
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2013-02-07
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多