使用 NSDictionary 对 NSArray 进行排序

Posted

技术标签:

【中文标题】使用 NSDictionary 对 NSArray 进行排序【英文标题】:Sorting a NSArray with NSDictionary inside it 【发布时间】:2017-01-17 08:42:42 【问题描述】:

我需要从星期一到星期五按顺序对数组进行排序。我在这里做了那部分

NSArray *userDays = [NSArray arrayWithObjects:@"Monday", @"Tuesday", @"Wednesday",@"Thursday",@"Friday",nil];
[sortArray addObject:model.title];
NSArray *sortedUserDays = [userDays filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF in (%@)", sortArray]];

所以,sortArray 有 5 个对象,分别是星期一、星期二、星期三、星期四和星期五。问题是当我对需要排序的数组进行排序时,比如说 tempArray。我刚刚创建了 sortArray 用于测试排序。

tempArray 里面有 NSDictionary。并且日期(星期一、星期二等...)在 title 键中。

现在在这一行

NSArray *sortedUserDays = [userDays filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF in (%@)", sortArray]];

我需要将 sortArray 更改为 tempArray.model.title 之类的内容。我该怎么做才能对嵌套的 NSArray 进行排序?

示例数据:

tempArray[0]
 title : "Friday", identity: "someUniqueIdentity", url: "httpwww.123" 

tempArray[1]
 title: "Wednesday", identity: "someUniqueIdentity2", url :"httpwww.1233" 

tempArray[2]
 title: "Monday", identity: "someUniqueIdentity3", url: "httpwww.1233" 


tempArray[3]
 title: "Thursday", identity: "someUniqueIdentity3", url :"httpwww.1233" 


tempArray[4]
 title: "Tuesday", identity: "someUniqueIdentity3", url: "httpwww.1233" 

预期输出:

tempArray[0]
 title: "Monday", identity: "someUniqueIdentity3", url: "httpwww.1233" 

tempArray[1]
 title: "Tuesday", identity: "someUniqueIdentity3", url :"httpwww.1233" 

tempArray[2]
 title: "Wednesday", identity: "someUniqueIdentity2", url :"httpwww.1233" 

tempArray[3]
 title: "Thursday", identity: "someUniqueIdentity3", url :"httpwww.1233" 

tempArray[4]
 title: "Friday", identity: "someUniqueIdentity", url: "httpwww.123" 

【问题讨论】:

我能很快知道你想做什么吗? 你在做的是过滤而不是排序,首先你需要解决它。 按星期一、星期二、星期三、星期四和星期五的格式对嵌套的 NSArray 进行排序 @Supermannoying 您的嵌套数组是字典数组的类型,每个字典都包含键标题,其值类似于userDays 元素。对吗? @Supermannoying 你正在寻找这个***.com/a/18089499/6433023 【参考方案1】:

我不确定我是否了解您要查找的内容,但可能是这样的吗?

NSArray *tempArray = @[
        @ @"title": @"Friday", @"identity" : @"someUniqueIdentity", @"url" : @"httpwww.123",
        @ @"title" : @"Wednesday", @"identity" :  @"someUniqueIdentity2", @"url" :  @"httpwww.1233" ,
        @ @"title" : @"Monday", @"identity" :  @"someUniqueIdentity3", @"url" :  @"httpwww.1233" ,
        @ @"title" : @"Thursday", @"identity" :  @"someUniqueIdentity3", @"url" :  @"httpwww.1233" ,
        @ @"title" : @"Tuesday", @"identity" :  @"someUniqueIdentity3", @"url" :  @"httpwww.1233" 
];

NSArray *weekdays = @[@"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday"];

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES comparator:^NSComparisonResult(NSString *day1, NSString *day2) 
    NSUInteger index1 = [weekdays indexOfObject:day1];
    NSUInteger index2 = [weekdays indexOfObject:day2];
    return (NSComparisonResult) (index1 >= index2);
];

NSArray *result = [tempArray sortedArrayUsingDescriptors:@[descriptor]];

【讨论】:

是的。我试过这个NSArray *filteredUser = [user filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF in (%@)", [tempArray valueForKey:@"title"]]]; 但filteredUser 现在是一个只有5 个对象的NSArray,周一到周五。其他键都不见了 @Supermannoying 编辑了我的答案。不过,您可能应该使代码更健壮一些..

以上是关于使用 NSDictionary 对 NSArray 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用值对 NSDictionary 的 NSArray 进行排序

如何对包含 NSDictionary 的 NSArray 进行排序?

按 NSDictionary 值对 NSArray 进行排序

使用特定键的值过滤 NSDictionary 的 NSArray

nsdictionary 上的排序给出的结果与 nsarray 上的排序不同

使用 NSDictionary 按 int 值过滤 NSArray