数组内部对象排序(sort)

本文介绍了如何利用苹果API中的迭代器、方法比较、函数比较和块代码自定义来实现对象排序,包括自定义类、排序示例及不同排序方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数组排序有很多方法比如for,while循环去进行冒泡排序或者快速看、排序等多种排序方法

 而我在这里要说的是苹果API提供的几个系统方法

  a.迭代器     Descriptor

  b.方法比较  Selector

  c.函数比较  Function

  d.块代码    Block自定义

2.示例

  1.1一个要比较对象的类(Person)

@interface Person : NSObject

@property(nonatomic , copy)NSString * name;

@property(nonatomic , copy)NSString * phone;

@property(nonatomic , assign)int age;

@end

 1.2自定义几个Person对象(在其他类中)

    Person *person1 = [[Person alloc] init];
    person1.name = @"gulong";
    person1.age = 23;
    
    Person *person2 = [[Person alloc] init];
    person2.name = @"guzheng";
    person2.age = 24;
    
    Person *person3 = [[Person alloc] init];
    person3.name = @"zhangsan";
    person3.age = 21;
    
    Person *person4 = [[Person alloc] init];
    person4.name = @"lisi";
    person4.age = 25;
    
    NSArray *originalArray = @[person1,person2,person3,person4];

 1.3排序开始

    1.3.1 使用迭代器进行排序

        使用NSSortDescriptor可以很方便的进行多条件排序

    NSSortDescriptor *sorter1 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSSortDescriptor *sorter2 = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:NO];
    NSArray *modifyArray1 = [originalArray sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sorter1,sorter2,nil]];

       //首先通过name的字母进行升序排序,然后进行age大小比较进行降序排序

      //数组通过sortedArrayUsingDescriptors可以进行多重排序(就是相等时就进行下一个比较迭代器)

    1.3.2 使用SEL方法排序

       首先需要在对象类里面定义并且在实现类里面实现这一方法(OC方法),该方法返回一个NSComparisonResult的枚举值(其实就是-1,0,1),然后NSArray调用sortedArrayUsingSelector这个方法时内部会进行相应的比较排序

Person.h
- (NSComparisonResult)compareAgeAscende:(id)other;
Person.m
- (NSComparisonResult)compareAgeAscende:(id)other { Person *otherPerson = (Person *)other; if (self.age > otherPerson.age) { return NSOrderedDescending; }else{ if (self.age == otherPerson.age) { return NSOrderedSame; }else{ return NSOrderedAscending; } } }

          下面是调用 sortedArrayUsingSelector

ViewController  (- (void)viewDidLoad)
  NSArray *modifyArray2 = [originalArray sortedArrayUsingSelector:@selector(compareAgeAscende:)];
  NSLog(@"modifyArray2 : %@",modifyArray2);

      注: a.当数组里面对象是NSString时可以用compare:进行sel比较

     1.3.3 函数比较  该函数是一个比较函数(C语言),该函数同样是放回NSComparisonResult这个枚举,其实就是一个NSInteger的整数,然后NSArray调用sortedArrayUsingFunction这个方法时内部会进行相应的比较排序    

// 定义在viewController里面(其实定义在哪里无所谓,主要是可以调用到就行)
NSInteger personSort(id obj1,id obj2 ,void * context){
    Person *person1 = (Person *)obj1;
    Person *person2 = (Person *)obj2;
    return [person1.name localizedCompare:person2.name];
}

 

NSArray *modifyArray3 = [originalArray sortedArrayUsingFunction:personSort context:NULL];
    NSLog(@"modifyArray3 : %@",modifyArray3);

     1.3.4 block比较 该block里面定义写一个比较的代码块,该代码块同样返回NSComparisonResult这个枚举

NSArray *modifyArray4 = [originalArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        Person *pers1 = (Person *)obj1;
        Person *pers2 = (Person *)obj2;
        if (pers1.age > pers2.age) {
            return NSOrderedDescending;
        }else if (pers1.age < pers2.age){
            return NSOrderedAscending;
        }else{
            return NSOrderedSame;
        }
    }];
    NSLog(@"modifyArray4 : %@",modifyArray4);

   1.4 字符串(带汉字)转拼音字符串 (为了上面的比较问题,为了更多需求)

- (NSString *) phonetic:(NSString*)sourceString {
    NSMutableString *source = [sourceString mutableCopy];
    CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformMandarinLatin, NO);
    CFStringTransform((__bridge CFMutableStringRef)source, NULL, kCFStringTransformStripDiacritics, NO);
    return source;
}
//汉字转拼音后会以空格隔开

转载于:https://www.cnblogs.com/gulong/p/4551125.html

<think>好的,用户想了解如何在JavaScript中根据属性对数组对象进行排序。首先,我需要回顾一下JavaScript中的sort方法。默认情况下,sort方法将元素转换为字符串并按Unicode码点排序,这对数字或对象属性来说不合适,所以必须提供比较函数。 用户提供的引用资料中有多个示例,都是通过定义compare函数,根据属性值进行比较。例如引用[2]和[4]中的例子,通过传入属性名,返回一个比较函数,比较两个对象的该属性值。这里需要注意升序和降序的区别,是value1 - value2还是反过来。 接下来,我需要整理这些示例,给出清晰的步骤说明。首先,用户需要准备一个对象数组,每个对象都有需要排序的属性。然后,定义比较函数,接收属性名,返回比较逻辑。在比较函数内部,获取两个对象对应的属性值,进行相减操作,这样sort方法就能正确排序了。 同时,用户可能需要多条件排序的情况,比如先按年龄排序,年龄相同再按姓名排序。这时候比较函数需要扩展,检查主属性是否相等,如果相等再比较次属性。这可能在用户的问题中没有提到,但作为相关知识可以提及。 另外,引用[3]中提到数字数组的升序排序,这也适用于对象属性,因为比较函数的结构类似。需要强调比较函数的返回值规则:负数、零、正数分别决定顺序。 最后,确保示例代码正确,并且符合用户提供的引用中的方法。可能需要结合多个引用中的例子,给出一个完整的示例,包括数组定义、比较函数和使用sort方法调用。同时,提醒用户注意箭头函数和普通函数的区别,确保在比较函数中正确处理this或其他上下文问题,不过在这些例子中可能不需要,因为使用的是属性参数。 总结步骤:1. 准备数组;2. 定义比较函数,接受属性;3. 在比较函数中返回a和b的比较结果;4. 使用sort方法并传入比较函数。同时,给出升序和降序的示例,以及多条件排序的可能扩展。最后,验证示例的正确性,确保输出符合预期。</think>### JavaScript数组对象根据属性排序的实现方法 在JavaScript中,通过`sort()`方法结合自定义比较函数,可以实现对数组对象按指定属性排序。以下是具体步骤和示例: #### 1. 单属性排序 **步骤说明:** 1. **定义对象数组**:包含需要排序的多个对象。 2. **编写比较函数**:接收属性名作为参数,返回一个比较函数。 3. **调用`sort()`方法**:将比较函数传入`sort()`,实现排序。 **示例代码(按`age`升序排序):** ```javascript var arr = [ {name: '大', age: 5}, {name: '剑', age: 18}, {name: '师', age: 8} ]; function compare(property) { return function(a, b) { const value1 = a[property]; const value2 = b[property]; return value1 - value2; // 升序 // return value2 - value1; // 降序 }; } console.log(arr.sort(compare('age'))); ``` 输出结果按`age`升序排列: ``` [ {name: '大', age: 5}, {name: '师', age: 8}, {name: '剑', age: 18} ] ``` #### 2. 多条件排序 若需先按`age`排序,`age`相同时再按`name`排序: ```javascript function compareMulti(properties) { return function(a, b) { // 主排序条件:age const compareAge = a.age - b.age; if (compareAge !== 0) return compareAge; // 次排序条件:name(字符串比较) return a.name.localeCompare(b.name); }; } console.log(arr.sort(compareMulti())); ``` #### 3. 使用箭头函数简化 ES6语法可进一步简化代码: ```javascript const compareArrow = property => (a, b) => a[property] - b[property]; arr.sort(compareArrow('age')); ``` #### 注意事项 - **数字排序**:必须使用比较函数(如`a.age - b.age`),否则默认按字符串排序会导致错误[^3]。 - **字符串排序**:需用`localeCompare()`处理字符顺序[^2]。 - **稳定性**:现代浏览器已实现稳定的`sort()`,但需注意旧版本兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值