js中的数组对象排序

一、普通数组排序   

  js中用方法sort()为数组排序。sort()方法有一个可选参数,是用来确定元素顺序的函数。如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序。如:
var arr = ["a", "b", "A", "B"];
arr.sort();
console.log(arr);//["A", "B", "a", "b"]
 因为字母A、B的ASCII值分别为65、66,而a、b的值分别为97、98,所
var arr = [15, 8, 25, 3];
arr.sort();
console.log(arr);//[15, 25, 3, 8]
 以上面输出的结果是 ["A", "B", "a", "b"] 。
    当数组位数字时:
 
 结果是 [15, 25, 3, 8] 。其实,sort方法会调用每个数组项的toString()方法,得到字符串,然后再对得到的字符串进行排序。虽然数值15比3大,但在进行字符串比较时"15"则排在"3"前面。显然,这种结果不是我们想要的,这时,sort()方法的参数就起到了作用,我们把这个参数叫做比较函数。
   比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数。例子:
 
var arr = [23, 9, 4, 78, 3];
var compare = function (x, y) {//比较函数
    if (x < y) {
        return -1;
    } else if (x > y) {
        return 1;
    } else {
        return 0;
    }
}
console.log(arr.sort(compare));        
 结果为 [3, 4, 9, 23, 78] ,返回了我们想要的结果。如果要按降序排序,比较函数写成这样即可:
 
var compare = function (x, y) {
    if (x < y) {
        return 1;
    } else if (x > y) {
        return -1;
    } else {
        return 0;
    }
}
 我们并不能用比较函数比较一个不能转化为数字的字符串与数字的顺序:
var arr = ["b", 5];
console.log(arr.sort(compare))
 结果是 ["b", 5] 。因为比较函数在比较时,会把先把字符串转化为数字,然后再比较,字符串b不能转化为数字,所以就不能比较大小。然而,当不用比较函数时,会比较ASCII值,所以结果是 [5, "b"] 。
 
二、数组对象排序
   如果数组项是对象,我们需要根据数组项的某个属性对数组进行排序,要怎么办呢?其实和前面的比较函数也差不多:
var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}];
var compare = function (obj1, obj2) {
    var val1 = obj1.name;
    var val2 = obj2.name;
    if (val1 < val2) {
        return -1;
    } else if (val1 > val2) {
        return 1;
    } else {
        return 0;
    }            
} 
console.log(arr.sort(compare));
 输出结果为 [Object { name="wlz", age=25}, Object { name="zlw", age=24}] ,可以看到数组已经按照 name 属性进行了排序。我们可以对上面的比较函数再改造一下:
var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }            
    } 
}
 如果想按照 age 进行排序, arr.sort(compare("age")) 即可。
 
  但是对age属性进行排序时需要注意了,如果age属性的值是数字,那么排序结果会是我们想要的。但很多时候我们从服务器传回来的数据中,属性值通常是字符串。现在我把上面的数组改为:
var arr = [{name: "zlw", age: "24"}, {name: "wlz", age: "5"}];
//可以看到,我把 age 属性由数字改为了字符串,第二个数组项的 age 值改为了 "5" 。再次调用 arr.sort(compare("age")) 后,结果为:
 
[Object { name="zlw", age="24"}, Object { name="wlz", age="5"}]
 我们的期望是5排在25前面,但是结果不是。这是因为当两个数字字符串比较大小时,会比较它们的ASCII值大小,比较规则是:从第一个字符开始,顺次向后直到出现不同的字符为止,然后以第一个不同的字符的ASCII值确定大小。所以"24"与"5"比较大小时,先比较”2“与"5"的ASCII值,显然”2“的ASCII值比"5"小,即确定排序顺序。
   现在,我们需要对比较函数再做一些修改:
 
var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];
        if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
            val1 = Number(val1);
            val2 = Number(val2);
        }
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }            
    } 
}
 在比较函数中,先把比较属性值转化为数字 Number(val1) 再通过 !isNaN(Number(val1)) 判断转化后的值是不是数字(有可能是NaN),转化后的值如果是数字,则比较转换后的值,这样就可以得到我们想要的结果了, 调用  arr.sort(compare("age")) 得到:
[Object { name="wlz", age="5"}, Object { name="zlw", age="24"}]
 
<think> 我们被要求回答关于JavaScript数组对象排序方法的问题。根据引用的内容,我们可以总结如下: 1. 直接使用`sort()`方法时,默认按照字符串的Unicode码点(以前是ASCII)进行排序。这意味着数字可能不会按数值大小排序(如[3]中的例子所示)。 2. 为了正确排序数组中的对象或非字符串元素,我们需要提供一个比较函数(compare function)作为`sort()`方法的参数。 3. 比较函数接收两个参数(通常称为a和b),并根据以下规则返回一个值: - 如果返回值小于0,则将a排在b前面。 - 如果返回值大于0,则将b排在a前面。 - 如果等于0,则a和b的相对位置不变。 4. 对于数字数组,我们可以通过比较函数`(a, b) => a - b`来实现升序排序(降序则为`b - a`)。 5. 对于对象数组,我们可以根据对象属性进行排序,如[2]中的示例所示: - 按数字属性排序:`arr.sort((a, b) => a.age - b.age)` - 按字符串属性排序:使用`localeCompare`方法,例如`a.name.localeCompare(b.name)` 6. `localeCompare`方法是字符串比较的推荐方法,因为它考虑了语言环境(如字母大小写、重音符号等)。 因此,针对用户的问题,我们可以这样回答: ### JavaScript数组对象排序方法 在JavaScript中,对数组对象排序主要使用数组的`sort()`方法。该方法可以接受一个可选的比较函数作为参数,用于定义排序顺序。如果不提供比较函数,则数组元素会被转换为字符串,并按照Unicode码点顺序进行排序。这可能导致数字排序不符合数值顺序(例如[1, 2, 10]会被排序为[1, 10, 2]),因此通常我们需要自定义比较函数。 #### 1. 基本用法(默认排序) ```javascript const arr = ["b", "a", "B", "A"]; arr.sort(); console.log(arr); // 输出: ["A", "B", "a", "b"] (因为大写字母的码点小于小写字母) ``` #### 2. 数字数组排序 要对数字数组按数值排序,需要提供比较函数: ```javascript const numbers = [3, 1, 4, 1, 5, 9, 2, 6]; // 升序排序 numbers.sort((a, b) => a - b); console.log(numbers); // 输出: [1, 1, 2, 3, 4, 5, 6, 9] // 降序排序 numbers.sort((a, b) => b - a); console.log(numbers); // 输出: [9, 6, 5, 4, 3, 2, 1, 1] ``` #### 3. 对象数组排序 对于对象数组,我们可以根据对象的某个属性进行排序。 **示例1:按数字属性排序** ```javascript const students = [ { name: "Alice", score: 90 }, { name: "Bob", score: 85 }, { name: "Charlie", score: 95 } ]; // 按score升序排序 students.sort((a, b) => a.score - b.score); console.log(students); // 输出: [ // { name: "Bob", score: 85 }, // { name: "Alice", score: 90 }, // { name: "Charlie", score: 95 } // ] ``` **示例2:按字符串属性排序** ```javascript // 按name属性排序(考虑语言环境) students.sort((a, b) => a.name.localeCompare(b.name)); console.log(students); // 假设按字母顺序,输出可能是: // [ // { name: "Alice", score: 90 }, // { name: "Bob", score: 85 }, // { name: "Charlie", score: 95 } // ] ``` #### 4. 多条件排序 有时需要根据多个属性排序。例如,先按score降序,score相同再按name升序: ```javascript students.sort((a, b) => { if (a.score !== b.score) { return b.score - a.score; // 降序 } else { return a.name.localeCompare(b.name); // 升序 } }); ``` #### 注意事项 - `sort()`方法会改变原数组(即原地排序),如果不想改变原数组,可以先复制数组排序,例如:`const sorted = [...arr].sort(...)`。 - 比较函数应当返回数值,而不是布尔值。例如,`(a, b) => a > b`可能不会总是得到正确结果,因为它返回布尔值(true转换为1,false转换为0),而我们需要负数、0或正数。 通过以上方法,您可以灵活地对JavaScript数组对象进行排序。 §§相关问题§§ 1. 如何对JavaScript中的日期数组进行排序2. 如何在排序时忽略字符串的大小写? 3. 如何实现数组的稳定排序(当比较相等时保持原始顺序)? </think> ### JavaScript数组对象排序方法详解 在JavaScript中,对数组对象排序主要使用数组的`sort()`方法。该方法可以接受一个可选的比较函数作为参数,用于定义排序规则。以下是核心方法和用法: #### 1. **基本排序(默认行为)** ```javascript const arr = ["b", "a", "B", "A"]; arr.sort(); // 默认按Unicode码点排序(ASCII顺序) console.log(arr); // 输出: ["A", "B", "a", "b"] ``` ⚠️ **注意**:默认排序会将元素转为字符串再比较,数字排序可能不符合预期(例如 `[1, 10, 2]`)[^1][^3]。 --- #### 2. **数字数组排序** 使用比较函数实现数值排序: ```javascript const numbers = [3, 1, 4, 1, 5, 9]; // 升序排序 numbers.sort((a, b) => a - b); // 输出: [1, 1, 3, 4, 5, 9] // 降序排序 numbers.sort((a, b) => b - a); // 输出: [9, 5, 4, 3, 1, 1] ``` 数学原理:比较函数返回 `负值`(a在b前)、`正值`(b在a前)或`0`(顺序不变)。 --- #### 3. **对象数组排序** 根据对象属性排序需自定义比较函数: ```javascript const users = [ { name: "张三", age: 20 }, { name: "李四", age: 25 }, { name: "王五", age: 22 } ]; // 按年龄升序 users.sort((a, b) => a.age - b.age); /* 输出: [ { name: "张三", age: 20 }, { name: "王五", age: 22 }, { name: "李四", age: 25 } ] */ // 按姓名升序(中文排序) users.sort((a, b) => a.name.localeCompare(b.name)); /* 输出: [ { name: "李四", age: 25 }, { name: "王五", age: 22 }, { name: "张三", age: 20 } ] */ ``` ✅ **关键方法**: - 数字属性用 `a.prop - b.prop` - 字符串属性用 `a.prop.localeCompare(b.prop)` 支持多语言排序[^2] --- #### 4. **多条件排序** ```javascript // 先按年龄降序,年龄相同按姓名升序 users.sort((a, b) => { if (a.age !== b.age) return b.age - a.age; // 年龄降序 return a.name.localeCompare(b.name); // 姓名升序 }); ``` --- #### 注意事项 1. `sort()` 会修改原数组,需复制数组可用 `[...arr].sort()` 2. 中文字符排序推荐始终用 `localeCompare()` 3. 空值处理建议显式判断,例如: ```javascript arr.sort((a, b) => (a.age ?? 0) - (b.age ?? 0)); ``` > 示例代码参考MDN文档及社区实践[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值