Objective C - 如何将此 NSArray 转换为 NSDictionary 以便我可以通过邮政编码查找城市名称?
Objective C - How do I convert this NSArray to an NSDictionary so I can look up city names by zip code?
我使用 Parse 作为我的后端,并且有一个云函数(用 javascript 编写)只是 return 一个数组
var providerZIPToCity = [ {zip:"48393", city:"WIXOM, MI"},{zip:"48116", city:"48116, MI"},{zip:"48114", city:"BRIGHTON, MI"},{zip:"48189", city:"WHITEMORE LAKE, MI"},{zip:"48178", city:"SOUTH LYON, MI"},{zip:"48168", city:"NORTHVILLE, MI"},{zip:"48167", city:"NORTHVILLE, MI"},{zip:"48375", city:"NOVI, MI"},{zip:"48374", city:"NOVI, MI"},{zip:"48165", city:"NEW HUDSON, MI"},{zip:"48377", city:"NOVI, MI"},{zip:"48390", city:"WALLED LAKE, MI"},{zip:"48381", city:"MILFORD, MI"},{zip:"48226", city:"DETROIT, MI"},{zip:"48201", city:"DETROIT, MI"}];
当我 return 并在我的应用程序中使用以下 objective c 代码将其打印出来时,我得到以下结果:
[PFCloud callFunctionInBackground:@"zipToCity" withParameters:@{} block:^(NSArray *results, NSError *error)
{
[_activityIndicator stopAnimating];
if( !error )
{
NSLog(@"%@",results);
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"CITY LOOKUP FAILED" message:@"We've failed to look up the city names for these ZIP codes. Try reloading this page from the menu. If the problem persists, you may not have a data or Wi-Fi connection." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
alert.tag = 0;
[alert show];
}
}];
returns:
2015-06-10 17:25:04.444 XXXXXXXXX[266:18098] (
{
city = "WIXOM, MI";
zip = 48393;
},
{
city = "48116, MI";
zip = 48116;
},
{
city = "BRIGHTON, MI";
zip = 48114;
},
{
city = "WHITEMORE LAKE, MI";
zip = 48189;
},
{
city = "SOUTH LYON, MI";
zip = 48178;
},
{
city = "NORTHVILLE, MI";
zip = 48168;
},
{
city = "NORTHVILLE, MI";
zip = 48167;
},
{
city = "NOVI, MI";
zip = 48375;
},
{
city = "NOVI, MI";
zip = 48374;
},
{
city = "NEW HUDSON, MI";
zip = 48165;
},
{
city = "NOVI, MI";
zip = 48377;
},
{
city = "WALLED LAKE, MI";
zip = 48390;
},
{
city = "MILFORD, MI";
zip = 48381;
},
{
city = "DETROIT, MI";
zip = 48226;
},
{
city = "DETROIT, MI";
zip = 48201;
}
)
我有一堆标签,其中包含我需要遍历的各种邮政编码,并将邮政编码旁边的标签更改为与该邮政编码关联的城市名称。我需要使用该数组 results
来构建 NSDictionary,或者以某种方式通过当前设置中的邮政编码访问这些城市名称。
问题是,我有点 objective C 菜鸟,我不完全确定这些数据是如何存储在数组中的。这个 NSArray 中的对象是什么类型?对我来说,它们似乎不是字典。我有点难过,只是对数据类型不够熟悉,无法弄清楚如何进行我需要的查找。
谁能指出我如何创建 NSMutableDictionary 的正确方向,我知道如何通过键(邮政编码)查找值(城市名称字符串),或者如何遍历我的邮政编码标签并使用此 NSArray 直接查找城市名称?
我正在想象
NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for( int i = 0; i < [results count]; i++ )
{
//get element, i.e. ( {city = "WIXOM, MI"; zip = 48393;} )
//create new NSMutableDictionary element
[ZIPsToCitiesDictionary setObject: <city> forKey: <zip>];
}
然后我可以使用 label.text 参数来访问城市名称,
或:
NSArray *ZIPLabelArray = ...;
NSMutableArray cityLabelArray = [NSMutableArray new]; //indexes correspond with ZIPLabelArray indexes
for( int i = 0; i < [ZIPLabelArray count]; i++ )
{
[cityLabelArray addObject: <city name somehow extracted from results by looking up the zip code at ZIPLabelArray[i]> ];
}
感谢任何提示。
你的数组元素确实是字典。要对此进行测试,您可以执行以下操作:
NSLog(@"%@", NSStringFromClass(results[0]));
你们非常亲密。你可以这样做:
NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for(NSDictionary* dict in results)
{
NSString* city = dict[@"city"];
NSString* zip = dict[@"zip"];
[ZIPsToCitiesDictionary setObject:city forKey:zip]; // or ZIPsToCitiesDictionary[zip] = city
}
更新以说明共享同一邮编的多个城市:
NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for(NSDictionary* dict in results)
{
NSString* city = dict[@"city"];
NSString* zip = dict[@"zip"];
NSMutableArray* citiesForZip = ZIPsToCitiesDictionary[zip];
if (!citiesForZip)
{
citiesForZip = [NSMutableArray new];
ZIPsToCitiesDictionary[zip] = citiesForZip;
}
[citiesForZip addObject:city];
}
这将生成一个字典,将邮政编码映射到 数组 个城市。
更简洁的方式
NSArray *filteredByZip = [results filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"zip == '48393'"]];
这将 return 一组符合条件 zip == 48393
的项目。
我使用 Parse 作为我的后端,并且有一个云函数(用 javascript 编写)只是 return 一个数组
var providerZIPToCity = [ {zip:"48393", city:"WIXOM, MI"},{zip:"48116", city:"48116, MI"},{zip:"48114", city:"BRIGHTON, MI"},{zip:"48189", city:"WHITEMORE LAKE, MI"},{zip:"48178", city:"SOUTH LYON, MI"},{zip:"48168", city:"NORTHVILLE, MI"},{zip:"48167", city:"NORTHVILLE, MI"},{zip:"48375", city:"NOVI, MI"},{zip:"48374", city:"NOVI, MI"},{zip:"48165", city:"NEW HUDSON, MI"},{zip:"48377", city:"NOVI, MI"},{zip:"48390", city:"WALLED LAKE, MI"},{zip:"48381", city:"MILFORD, MI"},{zip:"48226", city:"DETROIT, MI"},{zip:"48201", city:"DETROIT, MI"}];
当我 return 并在我的应用程序中使用以下 objective c 代码将其打印出来时,我得到以下结果:
[PFCloud callFunctionInBackground:@"zipToCity" withParameters:@{} block:^(NSArray *results, NSError *error)
{
[_activityIndicator stopAnimating];
if( !error )
{
NSLog(@"%@",results);
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"CITY LOOKUP FAILED" message:@"We've failed to look up the city names for these ZIP codes. Try reloading this page from the menu. If the problem persists, you may not have a data or Wi-Fi connection." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
alert.tag = 0;
[alert show];
}
}];
returns:
2015-06-10 17:25:04.444 XXXXXXXXX[266:18098] (
{
city = "WIXOM, MI";
zip = 48393;
},
{
city = "48116, MI";
zip = 48116;
},
{
city = "BRIGHTON, MI";
zip = 48114;
},
{
city = "WHITEMORE LAKE, MI";
zip = 48189;
},
{
city = "SOUTH LYON, MI";
zip = 48178;
},
{
city = "NORTHVILLE, MI";
zip = 48168;
},
{
city = "NORTHVILLE, MI";
zip = 48167;
},
{
city = "NOVI, MI";
zip = 48375;
},
{
city = "NOVI, MI";
zip = 48374;
},
{
city = "NEW HUDSON, MI";
zip = 48165;
},
{
city = "NOVI, MI";
zip = 48377;
},
{
city = "WALLED LAKE, MI";
zip = 48390;
},
{
city = "MILFORD, MI";
zip = 48381;
},
{
city = "DETROIT, MI";
zip = 48226;
},
{
city = "DETROIT, MI";
zip = 48201;
}
)
我有一堆标签,其中包含我需要遍历的各种邮政编码,并将邮政编码旁边的标签更改为与该邮政编码关联的城市名称。我需要使用该数组 results
来构建 NSDictionary,或者以某种方式通过当前设置中的邮政编码访问这些城市名称。
问题是,我有点 objective C 菜鸟,我不完全确定这些数据是如何存储在数组中的。这个 NSArray 中的对象是什么类型?对我来说,它们似乎不是字典。我有点难过,只是对数据类型不够熟悉,无法弄清楚如何进行我需要的查找。
谁能指出我如何创建 NSMutableDictionary 的正确方向,我知道如何通过键(邮政编码)查找值(城市名称字符串),或者如何遍历我的邮政编码标签并使用此 NSArray 直接查找城市名称?
我正在想象
NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for( int i = 0; i < [results count]; i++ )
{
//get element, i.e. ( {city = "WIXOM, MI"; zip = 48393;} )
//create new NSMutableDictionary element
[ZIPsToCitiesDictionary setObject: <city> forKey: <zip>];
}
然后我可以使用 label.text 参数来访问城市名称,
或:
NSArray *ZIPLabelArray = ...;
NSMutableArray cityLabelArray = [NSMutableArray new]; //indexes correspond with ZIPLabelArray indexes
for( int i = 0; i < [ZIPLabelArray count]; i++ )
{
[cityLabelArray addObject: <city name somehow extracted from results by looking up the zip code at ZIPLabelArray[i]> ];
}
感谢任何提示。
你的数组元素确实是字典。要对此进行测试,您可以执行以下操作:
NSLog(@"%@", NSStringFromClass(results[0]));
你们非常亲密。你可以这样做:
NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for(NSDictionary* dict in results)
{
NSString* city = dict[@"city"];
NSString* zip = dict[@"zip"];
[ZIPsToCitiesDictionary setObject:city forKey:zip]; // or ZIPsToCitiesDictionary[zip] = city
}
更新以说明共享同一邮编的多个城市:
NSMutableDictionary *ZIPsToCitiesDictionary = [NSMutableDictionary new];
for(NSDictionary* dict in results)
{
NSString* city = dict[@"city"];
NSString* zip = dict[@"zip"];
NSMutableArray* citiesForZip = ZIPsToCitiesDictionary[zip];
if (!citiesForZip)
{
citiesForZip = [NSMutableArray new];
ZIPsToCitiesDictionary[zip] = citiesForZip;
}
[citiesForZip addObject:city];
}
这将生成一个字典,将邮政编码映射到 数组 个城市。
更简洁的方式
NSArray *filteredByZip = [results filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"zip == '48393'"]];
这将 return 一组符合条件 zip == 48393
的项目。