You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript对象数组按字符串值排序异常问题及解决方法

问题分析与解决方案

原因

你的代码出现问题的核心原因是 JavaScript的Array.sort()是原地排序方法:它会直接修改调用它的原数组,而不是返回一个全新的数组。

当你先执行降序排序时,原数组(你示例代码里存在变量名笔误:定义的数组是myArray,但排序时用的是people,实际应该是同一个数组的引用)已经被直接修改为降序状态。此时再执行升序排序,你是在已经被降序修改过的数组上操作,而非原始数组。如果你的测试流程是连续运行这两段代码,就会出现逻辑错误,导致你误以为升序排序无效。

解决方案

要解决这个问题,你需要每次排序时基于原数组的副本操作,避免修改原始数组,确保每次排序都从原始数据出发。

正确代码示例

首先定义原始数组:

const myArray = [
    { name: "Name 1", age: 25 },
    { name: "Name 2", age: 13 },
    { name: "Name 3", age: 54 },
    { name: "Name 4", age: 56 },
    { name: "Name 5", age: 9 },
];

降序排序(基于副本)

const compareByNameDescending = (a, b) => b.name.localeCompare(a.name);
// 使用扩展运算符创建数组副本,再执行排序
const sortedArrayByNameDescending = [...myArray].sort(compareByNameDescending);
console.log(sortedArrayByNameDescending); // 输出正确的降序结果

升序排序(基于副本)

const compareByNameAscending = (a, b) => a.name.localeCompare(b.name);
// 同样基于原数组的副本排序
const sortedArrayByNameAscending = [...myArray].sort(compareByNameAscending);
console.log(sortedArrayByNameAscending); // 输出正确的升序结果

你也可以用Array.slice()方法创建副本,效果相同:

const sortedArrayByNameAscending = myArray.slice().sort(compareByNameAscending);

如果你需要在同一个环境中先后测试升序和降序,只要每次都基于原数组的副本操作,就能得到正确的结果,不会互相干扰。

内容的提问来源于stack exchange,提问作者user21194080

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:20:36