js数组对象排序

sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的 – 摘选自MDN

无条件的情况下升序和降序

var person = [
  { name: "zs", age: 18 },
  { name: "ll", age: 20 },
  { name: "ww", age: 15 },
  { name: "zl", age: 8 }
]
let up = person.sort((a, b) => { return a.age - b.age })//升序
console.log('up', up);
let down = person.sort((a, b) => { return b.age - a.age })//降序
console.log('down', down);

sort()方法排序的规则主要是根据传入函数的返回值是否大于0进行排序

1)当 a - b < 0 时, 则 a 元素排在 b 元素的前面。
2)当 a - b = 0 时, a , b 元素的位置不变。
3)当 a - b > 0 是, 则 a 元素排在 b 元素的后面。

以上是针对单纯的整数数组,但是需求往往肯定不会是这么简单。所以如果当数组的元素为对象时,则可能需要根据对象的属性进行排序,此时就会涉及到多条件排序。

多条件下的排序

先看下面这段代码

let arr = [{ "ranking": 1, "score": 100 }, { "ranking": 2, "score": 98 }, { "ranking": 5, "score": 60 }, { "ranking": 4, "score": 78 }, { "ranking": 3, "score": 89 }]
// 排序
function cardsSortRule(a, b) {
  // 正序
  if (a.ranking !== b.ranking) {
    // 按照排名升序
    return a.ranking - b.ranking
  } else if (a.numberField_kkvyvg87 !== b.numberField_kkvyvg87) {
    // 按照分数降序
    return b.score - a.score
  } else {
    return
  }
}
arr.sort(cardsSortRule)
console.log("排序后的数据:", arr)

最终的返回结果是:

[
  { ranking: 1, score: 100 },
  { ranking: 2, score: 98 },
  { ranking: 3, score: 89 },
  { ranking: 4, score: 78 },
  { ranking: 5, score: 60 }
]

参考链接:

js对象数组多字段排序 - 夏目的三三 - 博客园

个人博客已上线,欢迎来访~
传送门:夜雨炊烟

<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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨炊烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值